<?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=Qdibble</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=Qdibble"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Qdibble"/>
	<updated>2026-05-06T14:16:01Z</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_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142243</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142243"/>
		<updated>2021-11-30T02:24:58Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* review_response_map_spec.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
review_response_map.rb was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).  We test that it assigns a metareviewer to a review.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.  We test that it finds the corresponding team for a metareview response map and a regular response map.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'find_team_member' do&lt;br /&gt;
    context 'Finds the team of a reviewee' do&lt;br /&gt;
      it 'finds the team for a metareview response map' do&lt;br /&gt;
        allow(ResponseMap).to receive(:find_by).with(id: metareview_response_map.reviewed_object_id).and_return(metareview_response_map)&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find_by).with(id: review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
      it 'finds the team for a regular response map' do&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(review_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
In the home directory of expertiza, run the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should generate a coverage report with the same coverage figures as ours.&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142241</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142241"/>
		<updated>2021-11-30T02:24:07Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* Running Tests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).  We test that it assigns a metareviewer to a review.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.  We test that it finds the corresponding team for a metareview response map and a regular response map.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'find_team_member' do&lt;br /&gt;
    context 'Finds the team of a reviewee' do&lt;br /&gt;
      it 'finds the team for a metareview response map' do&lt;br /&gt;
        allow(ResponseMap).to receive(:find_by).with(id: metareview_response_map.reviewed_object_id).and_return(metareview_response_map)&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find_by).with(id: review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
      it 'finds the team for a regular response map' do&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(review_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
In the home directory of expertiza, run the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should generate a coverage report with the same coverage figures as ours.&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142240</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142240"/>
		<updated>2021-11-30T02:23:11Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* find_team_member */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).  We test that it assigns a metareviewer to a review.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.  We test that it finds the corresponding team for a metareview response map and a regular response map.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'find_team_member' do&lt;br /&gt;
    context 'Finds the team of a reviewee' do&lt;br /&gt;
      it 'finds the team for a metareview response map' do&lt;br /&gt;
        allow(ResponseMap).to receive(:find_by).with(id: metareview_response_map.reviewed_object_id).and_return(metareview_response_map)&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find_by).with(id: review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
      it 'finds the team for a regular response map' do&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(review_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142239</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142239"/>
		<updated>2021-11-30T02:23:00Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* find_team_member */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).  We test that it assigns a metareviewer to a review.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.  We test that it finds the corresponding team for a metareview response map and a regular response map.&lt;br /&gt;
&lt;br /&gt;
'''function: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'find_team_member' do&lt;br /&gt;
    context 'Finds the team of a reviewee' do&lt;br /&gt;
      it 'finds the team for a metareview response map' do&lt;br /&gt;
        allow(ResponseMap).to receive(:find_by).with(id: metareview_response_map.reviewed_object_id).and_return(metareview_response_map)&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find_by).with(id: review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
      it 'finds the team for a regular response map' do&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(review_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142238</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142238"/>
		<updated>2021-11-30T02:22:19Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* find_team_member */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).  We test that it assigns a metareviewer to a review.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
'''function: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: find_team_member'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'find_team_member' do&lt;br /&gt;
    context 'Finds the team of a reviewee' do&lt;br /&gt;
      it 'finds the team for a metareview response map' do&lt;br /&gt;
        allow(ResponseMap).to receive(:find_by).with(id: metareview_response_map.reviewed_object_id).and_return(metareview_response_map)&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find_by).with(id: review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
      it 'finds the team for a regular response map' do&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(review_response_map.reviewee_id).and_return(team)&lt;br /&gt;
        expect(review_response_map.find_team_member).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142233</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142233"/>
		<updated>2021-11-30T02:20:21Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* assign_metareviewer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).  We test that it assigns a metareviewer to a review.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142232</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142232"/>
		<updated>2021-11-30T02:19:48Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* metareviewed_by? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed.  We test that it returns true when itself (the response map) has been metareviewed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142231</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142231"/>
		<updated>2021-11-30T02:18:57Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* self.reviewer_assessments_for(team, reviewer) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.  We test that it returns the results with the latest version number.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142230</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142230"/>
		<updated>2021-11-30T02:17:45Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* self.assessments_for(team) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.  We test that it is able to get only assessments for submitted responses and assessments for other types of response maps. &lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142229</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142229"/>
		<updated>2021-11-30T02:15:52Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142228</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142228"/>
		<updated>2021-11-30T02:15:26Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  The function sends an email to the participant when they have a new teammate review to complete. We test to make sure the email is sent to the correct participant&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142227</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142227"/>
		<updated>2021-11-30T02:14:09Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* get_title */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.  We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  We test that the email delivery count is increased by one when the email method is called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142226</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142226"/>
		<updated>2021-11-30T02:13:31Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this the questionnaire method is impossible to test, ''so the test that has been written is commented out''.&amp;lt;br&amp;gt;&lt;br /&gt;
A band-aid solution is to modify questionnaire such that find_by is replaced with where!, and in that case the test can be uncommented and it passes.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  We test that the email delivery count is increased by one when the email method is called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142225</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142225"/>
		<updated>2021-11-30T02:11:23Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  We test that the email delivery count is increased by one when the email method is called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142224</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142224"/>
		<updated>2021-11-30T02:10:49Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so the test that has been written is commented out''.  This test can be used if find_by is replaced with where!, and in that case it passes.  The questionnaire function was not changed however since that is outside the scope of our project.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  We test that the email delivery count is increased by one when the email method is called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142223</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142223"/>
		<updated>2021-11-30T02:10:31Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so the test that has been written is commented out''.  This test can be used if find_by is replaced with where!, and in that case it passes.  The questionnaire function was not changed however since that is outside the scope of our project.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  We test that the email delivery count is increased by one when the email method is called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142222</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142222"/>
		<updated>2021-11-30T02:09:32Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so the test that has been written is commented out''.  This test can be used if find_by is replaced with where!, and in that case it passes.  The questionnaire function was not changed however since that is outside the scope of our project.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.  We test that the email delivery count is increased by one when the email method is called.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142220</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142220"/>
		<updated>2021-11-30T02:07:21Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* teammate_response_report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so the test that has been written is commented out''.  This test can be used if find_by is replaced with where!, and in that case it passes.  The questionnaire function was not changed however since that is outside the scope of our project.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.  We test that the function returns the corresponding teammate response report given a reviewer ID.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142219</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142219"/>
		<updated>2021-11-30T02:06:25Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so the test that has been written is commented out''.  This test can be used if find_by is replaced with where!, and in that case it passes.  The questionnaire function was not changed however since that is outside the scope of our project.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''commented test: questionnaire''' (for use when questionnaire is fixed)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # describe '#questionnaire' do&lt;br /&gt;
  #   # This method is little more than a wrapper for assignment.review_questionnaire_id()&lt;br /&gt;
  #&lt;br /&gt;
  #   context 'when corresponding active record for assignment_questionnaire is found' do&lt;br /&gt;
  #     before(:each) do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment.id).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1, assignment_teammate_questionnaire2])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find).with(1).and_return(assignment_teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #     it 'returns correct questionnaire found by used_in_round and topic_id if both used_in_round and topic_id are given' do&lt;br /&gt;
  #       allow(AssignmentQuestionnaire).to receive(:where).with(assignment_id: assignment1.id, used_in_round: 1, topic_id: 1).and_return(&lt;br /&gt;
  #           [assignment_teammate_questionnaire1])&lt;br /&gt;
  #       allow(Questionnaire).to receive(:find_by!).with(type: 'TeammateReviewQuestionnaire').and_return([teammate_questionnaire1])&lt;br /&gt;
  #       #allow(Questionnaire).to receive(:where!).and_return([teammate_questionnaire1])&lt;br /&gt;
  #       assignment1.questionnaires = [teammate_questionnaire1, teammate_questionnaire2]&lt;br /&gt;
  #       expect(teammate_review_response_map1.questionnaire()).to eq(teammate_questionnaire1)&lt;br /&gt;
  #     end&lt;br /&gt;
  #&lt;br /&gt;
  #   end&lt;br /&gt;
  # end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142216</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142216"/>
		<updated>2021-11-30T02:04:03Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this ''no tests have been written''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142215</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142215"/>
		<updated>2021-11-30T02:03:40Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.  The implementation of this method is inconsistent with the implementation of the questionnaire method in other classes, and uses find_by which always returns nil; because of this we have not tested it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142214</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142214"/>
		<updated>2021-11-30T02:02:26Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142213</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142213"/>
		<updated>2021-11-30T02:01:58Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142212</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142212"/>
		<updated>2021-11-30T02:01:24Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.  The last error check of the function (&amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;) is impossible to reach in the function.  This is because if the conditions to raise this error are met, a prior line in the code would have raised an error and exited first.  Because this line is impossible to reach, it is impossible to test and the testing for it is commented out.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142210</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142210"/>
		<updated>2021-11-30T01:59:03Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
'''function: import'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.import(row_hash, session, id)&lt;br /&gt;
    raise ArgumentError.new(&amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;) if row_hash.length &amp;lt; 3&lt;br /&gt;
    row_hash[:metareviewers].each do |row|&lt;br /&gt;
      # ACS Make All contributors as teams&lt;br /&gt;
      contributor = AssignmentTeam.where(name: row_hash[:reviewee].to_s, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;  if contributor.nil?&lt;br /&gt;
      ruser = User.find_by_name(row_hash[:reviewer].to_s.strip)&lt;br /&gt;
      reviewee = AssignmentParticipant.where(user_id: ruser.id, parent_id:  id).first&lt;br /&gt;
      raise ImportError, &amp;quot;Reviewee,  #{row_hash[:reviewer].to_s}, for contributor, #{contributor.name}, was not found.&amp;quot; if reviewee.nil?&lt;br /&gt;
      muser = User.find_by_name(row.to_s.strip)&lt;br /&gt;
      puts muser.name&lt;br /&gt;
      reviewer = AssignmentParticipant.where(user_id: muser.id, parent_id:  id)&lt;br /&gt;
      raise ImportError, &amp;quot;Metareviewer,  #{row.to_s}, for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s }, was not found.&amp;quot; if reviewer.nil?&lt;br /&gt;
      # ACS Removed the if condition(and corressponding else) which differentiate assignments as team and individual assignments&lt;br /&gt;
      # to treat all assignments as team assignments&lt;br /&gt;
      reviewmapping = ReviewResponseMap.where(reviewee_id: contributor.id, reviewer_id:  reviewee.id)&lt;br /&gt;
      # puts reviewee.id&lt;br /&gt;
      puts reviewer.id&lt;br /&gt;
      raise ImportError, &amp;quot;No review mapping was found for contributor, #{contributor.name}, and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot; if reviewmapping.nil?&lt;br /&gt;
      existing_mappings = MetareviewResponseMap.where(reviewee_id: reviewee.id, reviewer_id: reviewer.id, reviewed_object_id: reviewmapping.map_id)&lt;br /&gt;
      # if no mappings have already been imported for this combination&lt;br /&gt;
      # create it.&lt;br /&gt;
      MetareviewResponseMap.create(reviewer_id: reviewer.id, reviewee_id: reviewee.id, reviewed_object_id: reviewmapping.map_id) if existing_mappings.empty?&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142209</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142209"/>
		<updated>2021-11-30T01:58:07Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
        # # when a review response map is created&lt;br /&gt;
        # allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        # allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        # allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        # allow(ReviewResponseMap).to receive(:find_or_create_by)&lt;br /&gt;
        #                                 .with(reviewed_object_id: 1, reviewer_id: 2, reviewee_id: 1, calibrate_to: false)&lt;br /&gt;
        #                                 .and_return(nil)&lt;br /&gt;
        # expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;No review mapping was found for contributor, , and reviewee, #{row_hash[:reviewer].to_s}.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142208</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142208"/>
		<updated>2021-11-30T01:57:28Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* export_fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142207</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142207"/>
		<updated>2021-11-30T01:57:16Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* exports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142206</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142206"/>
		<updated>2021-11-30T01:57:03Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* get_title */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142205</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142205"/>
		<updated>2021-11-30T01:56:52Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''.&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142204</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142204"/>
		<updated>2021-11-30T01:56:43Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* questionnaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.  Currently the implementation of this method makes it impossible to test, ''so no test has been written''&lt;br /&gt;
&lt;br /&gt;
'''function: questionnaire'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142202</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142202"/>
		<updated>2021-11-30T01:53:35Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* assign_metareviewer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review). &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: assign_metareviewer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: assign_metareviwer'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'assign_metareviewer' do&lt;br /&gt;
    context 'Assigns a metareviewer to a review' do&lt;br /&gt;
      it 'creates a metareview response map' do&lt;br /&gt;
        metareview_response_map_temp = create(:meta_review_response_map, reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:create).with(reviewed_object_id: review_response_map1.id, reviewer_id: participant2.id, reviewee_id: participant1.id).and_return(\&lt;br /&gt;
          metareview_response_map_temp)&lt;br /&gt;
        expect(review_response_map1.assign_metareviewer(participant2)).to eq(metareview_response_map_temp)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142201</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142201"/>
		<updated>2021-11-30T01:52:49Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* metareviewed_by? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed &amp;lt;br&amp;gt;&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142200</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142200"/>
		<updated>2021-11-30T01:52:37Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* metareviewed_by? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
'''function: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: metareviewed_by?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'metareviewed_by?' do&lt;br /&gt;
    context 'Returning whether it is metareviewed' do&lt;br /&gt;
      it 'returns true' do&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).with(reviewee_id: team.id, reviewer_id: participant1.id, reviewed_object_id: review_response_map.id).and_return([metareview_response_map])&lt;br /&gt;
        expect(review_response_map.metareviewed_by?(participant1)).to eq(true)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142199</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142199"/>
		<updated>2021-11-30T01:51:54Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* self.reviewer_assessments_for(team, reviewer) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
'''function: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: reviewer_assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.reviewer_assessments_for' do&lt;br /&gt;
    context 'Returning latest version of responses by reviewer' do&lt;br /&gt;
      it 'returns the second response' do&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response5)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the version number' do&lt;br /&gt;
        response4.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
      it 'returns the response with the highest version number' do&lt;br /&gt;
        response4.version_num = 3&lt;br /&gt;
        response5.version_num = 2&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team2.id, reviewer_id: participant2.id ).and_return([review_response_map2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: review_response_map2.id).and_return([response4, response5])&lt;br /&gt;
        responses = ResponseMap.reviewer_assessments_for(team2, participant2)&lt;br /&gt;
	expect(responses).to eq(response4)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142197</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142197"/>
		<updated>2021-11-30T01:50:46Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* comparator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142196</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142196"/>
		<updated>2021-11-30T01:49:23Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* self.assessments_for(team) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
'''function: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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: assessments_for'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe 'self.assessments_for' do&lt;br /&gt;
    context 'Getting assessments for Review Response map' do&lt;br /&gt;
      it 'returns only submitted responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: team.id).and_return([review_response_map, review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 1).and_return([response])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 2).and_return([response1])&lt;br /&gt;
        responses = ResponseMap.assessments_for(team)&lt;br /&gt;
	expect(responses).to eq([response])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'Getting assessments for other Response maps' do&lt;br /&gt;
      it 'returns all responses' do&lt;br /&gt;
        allow(Team).to receive(:find).and_return(team1)&lt;br /&gt;
        allow(ResponseMap).to receive(:where).with(reviewee_id: participant2.id).and_return([teammate_review_response_map, teammate_review_response_map1])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 3).and_return([response2])&lt;br /&gt;
        allow(Response).to receive(:where).with(map_id: 4).and_return([response3])&lt;br /&gt;
        responses = ResponseMap.assessments_for(participant2)&lt;br /&gt;
	expect(responses).to eq([response2, response3])&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142193</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142193"/>
		<updated>2021-11-30T01:47:46Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
'''function: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: email'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#email' do&lt;br /&gt;
    context 'when an email notification is sent' do&lt;br /&gt;
      it '#email' do&lt;br /&gt;
        reviewer_id = 1&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find).with(2).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;TeammateReview&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 { teammate_review_response_map1.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .to change { ActionMailer::Base.deliveries.count }.by 1&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142192</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142192"/>
		<updated>2021-11-30T01:47:00Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* teammate_response_report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
'''function: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: teammate_response_report'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  describe '#teammate_response_report' do&lt;br /&gt;
    context 'return an assignment given an id' do&lt;br /&gt;
      it '#teammate_response_report' do&lt;br /&gt;
        allow(TeammateReviewResponseMap).to receive_message_chain(:select, :where).and_return(assignment1);&lt;br /&gt;
        expect(TeammateReviewResponseMap.teammate_response_report(2)).to eq(assignment1);&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142191</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142191"/>
		<updated>2021-11-30T01:45:41Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* get_title */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''function: get title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;  &lt;br /&gt;
   describe '#get_title' do&lt;br /&gt;
    context 'when get_title is called' do&lt;br /&gt;
      it '#get_title' do&lt;br /&gt;
        expect(teammate_review_response_map1.get_title).to eq(&amp;quot;Teammate Review&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142188</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142188"/>
		<updated>2021-11-30T01:43:46Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: 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;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: 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;Metareview&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 { metareview_response_map.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
            .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;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142187</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142187"/>
		<updated>2021-11-30T01:43:03Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''test: import'''&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;, metareviewers: [&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 { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ArgumentError, &amp;quot;Not enough items. The string should contain: Author, Reviewer, ReviewOfReviewer1 &amp;lt;, ..., ReviewerOfReviewerN&amp;gt;&amp;quot;)&lt;br /&gt;
        # when reviewee user doesn't exist&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name1&amp;quot;}&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name1&amp;quot;).and_return(student)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:find_by).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Contributor, &amp;quot; + row_hash[:reviewee].to_s + &amp;quot;, was not found.&amp;quot;)&lt;br /&gt;
        # when a metareview response map is created&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return([student])&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1).to eq(metareview_response_map) }&lt;br /&gt;
        ## when reviewer user doesn't exist&lt;br /&gt;
        allow(User).to receive(:find_by).with(name: &amp;quot;name2&amp;quot;).and_return(student2)&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 3, parent_id: 1).and_return([participant])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:where).with(name: &amp;quot;name&amp;quot;, parent_id: 1).and_return([team])&lt;br /&gt;
        allow(AssignmentParticipant).to receive(:where).with(user_id: 1, parent_id: 1).and_return(nil)&lt;br /&gt;
        row_hash = {reviewee: &amp;quot;name&amp;quot;, metareviewers: [&amp;quot;name1&amp;quot;], reviewer: &amp;quot;name2&amp;quot;}&lt;br /&gt;
        expect { MetareviewResponseMap.import(row_hash, session, 1) }.to raise_error(ImportError, &amp;quot;Metareviewer,  name1, for contributor, team no name, and reviewee, name2, was not found.&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142186</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142186"/>
		<updated>2021-11-30T01:41:02Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* export_fields */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
'''function: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: export_fields'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds fields' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(MetareviewResponseMap.export_fields(nil)).to eq([&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142185</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142185"/>
		<updated>2021-11-30T01:40:24Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* exports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''function: export'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
'''test: export'''&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(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:find_by).and_return(metareview_response_map)&lt;br /&gt;
        allow(Assignment).to receive(:find).and_return(assignment)&lt;br /&gt;
        allow(Assignment).to receive(:metareview_mappings).and_return(metareview_response_map)&lt;br /&gt;
        expect(MetareviewResponseMap.export(csv, parent_id, options)).to eq([metareview_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;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142184</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142184"/>
		<updated>2021-11-30T01:37:29Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* get_title */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
'''function: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''test: get_title'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds title' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_title).to eq(&amp;quot;Metareview&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
====export_fields====&lt;br /&gt;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142181</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142181"/>
		<updated>2021-11-30T01:36:13Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* contributor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
'''function: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: contributor'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds the contributor of the metareview' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        allow(AssignmentTeam).to receive(:find).with(1).and_return(team)&lt;br /&gt;
        expect(metareview_response_map.contributor).to eq(team)&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
====export_fields====&lt;br /&gt;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142180</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142180"/>
		<updated>2021-11-30T01:35:40Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* metareview_response_map_spec.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test: get_all_versions'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      it 'finds version numbers' do&lt;br /&gt;
        allow(Response).to receive(:find).and_return(response)&lt;br /&gt;
        allow(MetareviewResponseMap).to receive(:where).and_return([metareview_response_map])&lt;br /&gt;
        expect(metareview_response_map.get_all_versions).to eq([])&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
====export_fields====&lt;br /&gt;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142178</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142178"/>
		<updated>2021-11-30T01:33:38Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* get_all_versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
'''function'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''test'''&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
====export_fields====&lt;br /&gt;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142176</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142176"/>
		<updated>2021-11-30T01:31:44Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* review_response_map_spec.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
This file was originally 92.5% covered, therefore no extra tests were written.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
====export_fields====&lt;br /&gt;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142174</id>
		<title>CSC/ECE 517 Fall 2021 - E2170. Testing - Response Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2170._Testing_-_Response_Maps&amp;diff=142174"/>
		<updated>2021-11-30T01:31:06Z</updated>

		<summary type="html">&lt;p&gt;Qdibble: /* Description about project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Description about project ==&lt;br /&gt;
This page is a description of Expertiza final project E2170 which aims to adequately test several files regarding the ResponseMap model. Here is a description of what response maps do:&lt;br /&gt;
*In Expertiza, response maps establish a relationship between a reviewer, a reviewee, and an object to be reviewed.  The reviewer is an assignment_participant, the reviewee is an assignment_team, and the reviewed object is either an assignment or another response_map. Each (reviewer, reviewee) pair will have a separate response map. Every time a new review is performed (e.g, every round), a new Response object is created whose map_id is that response map.&lt;br /&gt;
&lt;br /&gt;
The breakdown of the ResponseMap model can be found [https://expertiza.csc.ncsu.edu/index.php/Response_maps here]. There are several types of ResponseMaps that extend functionality of the original ResponseMap. None of which including the superclass are adequately tested. These files include:&lt;br /&gt;
&lt;br /&gt;
* review_response_map.rb  &amp;lt;--------- 92.5% coverage&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map.rb &amp;lt;------ 81.48% coverage&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map.rb &amp;lt;- 94.74% coverage&lt;br /&gt;
&lt;br /&gt;
* response_map.rb &amp;lt;----------------- 96.45% coverage&lt;br /&gt;
&lt;br /&gt;
This project aimed to get all the response maps to at least a 80% level of coverage for every Response Map file by writing unit tests for each uncovered method listed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Connor Smith (cpsmith6)&lt;br /&gt;
&lt;br /&gt;
* Abir Majumder (aamajumd)&lt;br /&gt;
&lt;br /&gt;
* Quinn Dibble (qdibble)&lt;br /&gt;
&lt;br /&gt;
* Alex Carruth (agcarrut)&lt;br /&gt;
&lt;br /&gt;
== Test Files Involved ==&lt;br /&gt;
There are 4 test files involved in this project:&lt;br /&gt;
* review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* metareview_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* teammate_review_response_map_spec.rb&lt;br /&gt;
&lt;br /&gt;
* response_map_spec.rb&lt;br /&gt;
of these files, only review_response_map_spec.rb currently exists; the rest will be added.&lt;br /&gt;
&lt;br /&gt;
== Methods Tested Per File ==&lt;br /&gt;
&lt;br /&gt;
=== review_response_map_spec.rb ===&lt;br /&gt;
Currently this file is 92.5% covered and there are no plans to cover it further.&lt;br /&gt;
&lt;br /&gt;
=== metareview_response_map_spec.rb ===&lt;br /&gt;
The functions for metareview_response_map.rb that will be tested are:&lt;br /&gt;
====get_all_versions====&lt;br /&gt;
This returns a sorted array of all the different versions of what is being reviewed in this response map. This means for a test, we will need to create a reviewer, a reviewee, several types of reviews of different versions to be sorted correctly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# return all the versions available for a response map.&lt;br /&gt;
  # a person who is doing meta review has to be able to see all the versions of review.&lt;br /&gt;
  def get_all_versions&lt;br /&gt;
    if self.review_mapping.response&lt;br /&gt;
      @sorted_array = []&lt;br /&gt;
      @prev = Response.all&lt;br /&gt;
      @prev.each do |element|&lt;br /&gt;
        @sorted_array &amp;lt;&amp;lt; element if element.map_id == self.review_mapping.map_id&lt;br /&gt;
      end&lt;br /&gt;
      @sorted = @sorted_array.sort {|m1, m2| m1.version_num || if m2.version_num&lt;br /&gt;
                                                                  m1.version_num &amp;lt;=&amp;gt; m2.version_num&lt;br /&gt;
                                                                else&lt;br /&gt;
                                                                  m1.version_num ? -1 : 1&lt;br /&gt;
                                                                end }&lt;br /&gt;
      # return all the lists in ascending order.&lt;br /&gt;
      @sorted&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====contributor====&lt;br /&gt;
Returns the team associated with the ReviewResponseMap that is to be metareviewed. We will need to create a ReviewResponseMap that has a team associated with it. Then we must create MetareviewResponseMap that points to a created ReviewResponseMap via the reviewed_object_id attribute. We will test if it indeed returns the team associated with ReviewResponseMap.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# First, find the &amp;quot;ReviewResponseMap&amp;quot; to be metareviewed;&lt;br /&gt;
  # Second, find the team in the &amp;quot;ReviewResponseMap&amp;quot; record.&lt;br /&gt;
  def contributor&lt;br /&gt;
    team_review_map = ReviewResponseMap.find(self.reviewed_object_id)&lt;br /&gt;
    AssignmentTeam.find(team_review_map.reviewee_id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====questionnaire====&lt;br /&gt;
Returns all questionnaires associated to the assignment of this MetareviewResponseMap that is of type 'MetareviewQuestionnaire'. We will need to create a valid MetareviewResponseMap including at least one MetareviewQuestionnaire that can be returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'MetareviewQuestionnaire')&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====get_title====&lt;br /&gt;
Returns string &amp;quot;Metareview&amp;quot;. We will test if this string is the same as typed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_title&lt;br /&gt;
    &amp;quot;Metareview&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====exports====&lt;br /&gt;
This function takes 3 parameters: csv (the csv file that will contain the exported metareview information), parent_id (the assignment ID containing the requested metareviews), and _options. The function sends all the information about the metareviews to a csv file. We will test that the information is properly exported to the csv file.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export(csv, parent_id, _options)&lt;br /&gt;
    mappings = Assignment.find(parent_id).metareview_mappings&lt;br /&gt;
    mappings = mappings.sort_by {|a| [a.review_mapping.reviewee.name, a.reviewee.name, a.reviewer.name] }&lt;br /&gt;
    mappings.each do |map|&lt;br /&gt;
      csv &amp;lt;&amp;lt; [&lt;br /&gt;
        map.review_mapping.reviewee.name,&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;
&lt;br /&gt;
====export_fields====&lt;br /&gt;
Takes a parameter called &amp;quot;_options&amp;quot; that returns the three field columns associated with metareviews to be exported for use by other controllers. We will test to see that these three columns are properly returned.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.export_fields(_options)&lt;br /&gt;
    fields = [&amp;quot;contributor&amp;quot;, &amp;quot;reviewed by&amp;quot;, &amp;quot;metareviewed by&amp;quot;]&lt;br /&gt;
    fields&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====import====&lt;br /&gt;
This function takes 3 parameters: row_hash (represents the hash of the metareview data we want to import), session, and id (representing the id of the assignment we want to import metareview data for). The function imports the data from the hash map, and if the information is input correctly, the data is extracted from the hash and creates a metareview for the requested assignment, otherwise it flashes an error saying the data was input incorrectly. We will test to make sure the imported data is properly converted into a metareview.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:E2170-import.jpg]]&lt;br /&gt;
&lt;br /&gt;
====email====&lt;br /&gt;
This function takes 3 parameters: defn, _participant (the user who will be receiving the email), and assignment (the assignment associated with the metareview). The function sends an email to the participant when they have a new metareview to complete. We will test to make sure the email is sent to the correct participant.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def email(defn, _participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Metareview&amp;quot;&lt;br /&gt;
    reviewee_user = Participant.find(reviewee_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    defn[:body][:first_name] = User.find(reviewee_user.user_id).fullname&lt;br /&gt;
    defn[:to] = User.find(reviewee_user.user_id).email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== teammate_review_response_map_spec.rb ===&lt;br /&gt;
The functions for teammate_review_response_map.rb that will be tested are:&lt;br /&gt;
==== questionnaire ====&lt;br /&gt;
This function searches for a TeammateReviewQuestionnaire object and returns it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def questionnaire&lt;br /&gt;
    self.assignment.questionnaires.find_by(type: 'TeammateReviewQuestionnaire')&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== get_title ====&lt;br /&gt;
This function returns the string &amp;quot;Teammate Review&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def get_title&lt;br /&gt;
    &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== teammate_response_report ====&lt;br /&gt;
This function returns the teammate response report given the reviewer ID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def self.teammate_response_report(id)&lt;br /&gt;
    TeammateReviewResponseMap.select(&amp;quot;DISTINCT reviewer_id&amp;quot;).where(&amp;quot;reviewed_object_id = ?&amp;quot;, id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== email ====&lt;br /&gt;
This function sends a notification email to a student who has been reviewed by their teammate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Send Teammate Review Emails&lt;br /&gt;
  # Refactored from email method in response.rb&lt;br /&gt;
  def email(defn, participant, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Teammate Review&amp;quot;&lt;br /&gt;
    participant = AssignmentParticipant.find(reviewee_id)&lt;br /&gt;
    topic_id = SignedUpTeam.topic_id(participant.parent_id, participant.user_id)&lt;br /&gt;
    defn[:body][:obj_name] = assignment.name&lt;br /&gt;
    user = User.find(participant.user_id)&lt;br /&gt;
    defn[:body][:first_name] = user.fullname&lt;br /&gt;
    defn[:to] = user.email&lt;br /&gt;
    Mailer.sync_message(defn).deliver&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== response_map_spec.rb ===&lt;br /&gt;
The functions for response_map.rb that will be tested are:&lt;br /&gt;
==== self.assessments_for(team) ====&lt;br /&gt;
Gets all submitted Review Responses or all regular Responses for a team, sorts the responses by version, and returns the latest Responses.&lt;br /&gt;
&lt;br /&gt;
[[File:E2170-assessments_for.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the responses&lt;br /&gt;
  def self.assessments_for(team)&lt;br /&gt;
    responses = []&lt;br /&gt;
    # stime = Time.now&lt;br /&gt;
    if team&lt;br /&gt;
      @array_sort = []&lt;br /&gt;
      @sort_to = []&lt;br /&gt;
      maps = where(reviewee_id: team.id)&lt;br /&gt;
      maps.each do |map|&lt;br /&gt;
        next if map.response.empty?&lt;br /&gt;
        @all_resp = Response.where(map_id: map.map_id).last&lt;br /&gt;
        if map.type.eql?('ReviewResponseMap')&lt;br /&gt;
          # If its ReviewResponseMap then only consider those response which are submitted.&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp if @all_resp.is_submitted&lt;br /&gt;
        else&lt;br /&gt;
          @array_sort &amp;lt;&amp;lt; @all_resp&lt;br /&gt;
        end&lt;br /&gt;
        # sort all versions in descending order and get the latest one.&lt;br /&gt;
        # @sort_to=@array_sort.sort { |m1, m2| (m1.version_num and m2.version_num) ? m2.version_num &amp;lt;=&amp;gt; m1.version_num : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        @sort_to = @array_sort.sort # { |m1, m2| (m1.updated_at and m2.updated_at) ? m2.updated_at &amp;lt;=&amp;gt; m1.updated_at : (m1.version_num ? -1 : 1) }&lt;br /&gt;
        responses &amp;lt;&amp;lt; @sort_to[0] unless @sort_to[0].nil?&lt;br /&gt;
        @array_sort.clear&lt;br /&gt;
        @sort_to.clear&lt;br /&gt;
      end&lt;br /&gt;
      responses = 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;
&lt;br /&gt;
==== comparator ====&lt;br /&gt;
Compares two Responses version numbers and returns a -1,0, or 1 depending on which version number is greater. If there is no version number for the first response, -1 is returned, otherwise 1 is returned.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def comparator(m1, m2)&lt;br /&gt;
    if m1.version_num and m2.version_num&lt;br /&gt;
      m2.version_num &amp;lt;=&amp;gt; m1.version_num&lt;br /&gt;
    elsif m1.version_num&lt;br /&gt;
      -1&lt;br /&gt;
    else&lt;br /&gt;
      1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== self.reviewer_assessments_for(team, reviewer) ====&lt;br /&gt;
Gets the Responses for a team reviewed by a specific reviewer and returns the latest response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # return latest versions of the response given by reviewer&lt;br /&gt;
  def self.reviewer_assessments_for(team, reviewer)&lt;br /&gt;
    # get_reviewer may return an AssignmentParticipant or an AssignmentTeam&lt;br /&gt;
    map = where(reviewee_id: team.id, reviewer_id: reviewer.get_reviewer.id)&lt;br /&gt;
    Response.where(map_id: map).sort {|m1, m2| self.comparator(m1, m2) }[0]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== metareviewed_by? ====&lt;br /&gt;
Returns whether the Response Map has been metareviewed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Evaluates whether this response_map was metareviewed by metareviewer&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def metareviewed_by?(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.where(reviewee_id: self.reviewer.id, reviewer_id: metareviewer.id, reviewed_object_id: self.id).count &amp;gt; 0&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== assign_metareviewer ====&lt;br /&gt;
This function is in charge of assigning a metareviewer to this review (i.e. a reviewer to review the review).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Assigns a metareviewer to this review (response)&lt;br /&gt;
  # @param[in] metareviewer AssignmentParticipant object&lt;br /&gt;
  def assign_metareviewer(metareviewer)&lt;br /&gt;
    MetareviewResponseMap.create(reviewed_object_id: self.id,&lt;br /&gt;
                                 reviewer_id: metareviewer.id, reviewee_id: reviewer.id)&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== find_team_member ====&lt;br /&gt;
This function returns the team that the reviewer is part of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def find_team_member&lt;br /&gt;
    # ACS Have metareviews done for all teams&lt;br /&gt;
    if self.type.to_s == &amp;quot;MetareviewResponseMap&amp;quot;&lt;br /&gt;
        review_mapping = ResponseMap.find_by(id: map.reviewed_object_id)&lt;br /&gt;
        team = AssignmentTeam.find_by(id: review_mapping.reviewee_id)&lt;br /&gt;
    else&lt;br /&gt;
        team = AssignmentTeam.find(self.reviewee_id)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running Tests ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  rspec spec/models/metareview_response_map_spec.rb spec/models/teammate_review_response_map_spec.rb spec/models/response_map_spec.rb spec/models/review_response_map_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Qdibble</name></author>
	</entry>
</feed>