<?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=Dbhanda</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=Dbhanda"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Dbhanda"/>
	<updated>2026-05-09T02:59:15Z</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_2017/E1749_Test_First_Development_Refactor_questionnaire_controller.rb&amp;diff=110956</id>
		<title>CSC/ECE 517 Fall 2017/E1749 Test First Development Refactor questionnaire controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_Test_First_Development_Refactor_questionnaire_controller.rb&amp;diff=110956"/>
		<updated>2017-10-30T02:14:35Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: Created page with &amp;quot;== About == Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://gi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
#*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
#*	Write failing tests first. &lt;br /&gt;
#*	Use polymorphism to replace the long switch statements &lt;br /&gt;
#**	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
#**	Replace the conditional with the relevant method calls &lt;br /&gt;
#**	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017&amp;diff=110955</id>
		<title>CSC/ECE 517 Fall 2017</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017&amp;diff=110955"/>
		<updated>2017-10-30T02:13:38Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Writing Assignment 2'''&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1779. Fix teammate advertisements and requests to join a team]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1773 Investigate and Fix Expertiza Production Version Runtime Exceptions.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1774 Metareview fixes and improvements.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1788 OSS project Maroon Heatmap fixes]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1781 Topic Management]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1745_Refactor_response_controller.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1752 Refactor assignments controller]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1776_Enhance_Imports]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1756 TLD Refactor response.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1772_Refactor reputation_web_service_controller.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/M1754_Mutation Testing on Servo]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1753 OSS project bidding tests]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1766_Test team functionality]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1787_OSS project Bronze Score calculations]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1763 Fix Staggered-Deadline Assignments]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1757 Introduce a Student View for instructors]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1769_Refactor assignment_form.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1754_Feature_test_of_rubric_advice]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1782 OSS Project Red Assignment Directories]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1748 Add past-due assignments to task list]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1761 Test First Development Refactor assignment.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1780_OSS_Project_Teal_Email_Notification_Enhancements]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1762 Test various kinds of response-map hierarchies]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1759 ]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2017/E1749_Test First Development Refactor questionnaire_controller.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1777 Coherent specification of review requirements.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2017/E1767 Improve imports]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110598</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110598"/>
		<updated>2017-10-28T02:16:53Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_TFD_questionnaire_controller.rb_refactor&amp;diff=110597</id>
		<title>CSC/ECE 517 Fall 2017/E1749 TFD questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_TFD_questionnaire_controller.rb_refactor&amp;diff=110597"/>
		<updated>2017-10-28T02:15:24Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: Created page with &amp;quot;== About == Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://gi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
#*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
#*	Write failing tests first. &lt;br /&gt;
#*	Use polymorphism to replace the long switch statements &lt;br /&gt;
#**	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
#**	Replace the conditional with the relevant method calls &lt;br /&gt;
#**	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110587</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110587"/>
		<updated>2017-10-28T01:48:10Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks assigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
#*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
#*	Write failing tests first. &lt;br /&gt;
#*	Use polymorphism to replace the long switch statements &lt;br /&gt;
#**	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
#**	Replace the conditional with the relevant method calls &lt;br /&gt;
#**	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110586</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110586"/>
		<updated>2017-10-28T01:47:54Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks assigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
#*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
#*	Write failing tests first. &lt;br /&gt;
#*	Use polymorphism to replace the long switch statements &lt;br /&gt;
#**	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
##*	Replace the conditional with the relevant method calls &lt;br /&gt;
##*	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110585</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110585"/>
		<updated>2017-10-28T01:47:10Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks assigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
#*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
#*	Write failing tests first. &lt;br /&gt;
#*	Use polymorphism to replace the long switch statements &lt;br /&gt;
##*	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
##*	Replace the conditional with the relevant method calls &lt;br /&gt;
##*	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110584</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110584"/>
		<updated>2017-10-28T01:46:43Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks assigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
#*	Write failing tests first &lt;br /&gt;
#*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
#*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
:*	Write failing tests first. &lt;br /&gt;
:*	Use polymorphism to replace the long switch statements &lt;br /&gt;
::*	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
::*	Replace the conditional with the relevant method calls &lt;br /&gt;
::*	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
:*	Write failing tests first &lt;br /&gt;
:*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110579</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110579"/>
		<updated>2017-10-28T01:45:40Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks assigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &lt;br /&gt;
#	Refactor create method &lt;br /&gt;
:*	Write failing tests first &lt;br /&gt;
:*	Split into several simpler methods and assign reasonable names &lt;br /&gt;
:*	Extract duplicated code into separate methods &lt;br /&gt;
#	Refactor update_quiz, save_choices method &lt;br /&gt;
:*	Write failing tests first. &lt;br /&gt;
:*	Use polymorphism to replace the long switch statements &lt;br /&gt;
::*	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &lt;br /&gt;
::*	Replace the conditional with the relevant method calls &lt;br /&gt;
::*	Remove duplicated code &lt;br /&gt;
#	Use find_by instead of dynamic method &lt;br /&gt;
:*	Write failing tests first &lt;br /&gt;
:*	L68, L385, L386, L559, L560&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110577</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110577"/>
		<updated>2017-10-28T01:44:41Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks assigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
#	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
#	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
#	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::*	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::*	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::*	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
#	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:*	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110574</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110574"/>
		<updated>2017-10-28T01:43:41Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
:*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
:*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110571</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110571"/>
		<updated>2017-10-28T01:42:50Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Files involved */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110568</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110568"/>
		<updated>2017-10-28T01:42:14Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Files involved and Issues in them */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
&lt;br /&gt;
*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110564</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110564"/>
		<updated>2017-10-28T01:41:04Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Files involved and Issues in them */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
*	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
*	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
*	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110562</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110562"/>
		<updated>2017-10-28T01:40:24Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Files involved and Issues in them */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
# questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
# questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110561</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110561"/>
		<updated>2017-10-28T01:37:07Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Setting Up The Working Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bash ./setup.sh &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle install &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;rake db:migrate &amp;lt;/pre&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110560</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110560"/>
		<updated>2017-10-28T01:35:28Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Setting Up The Working Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	cd expertiza &amp;lt;/pre&amp;gt;&lt;br /&gt;
	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110559</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110559"/>
		<updated>2017-10-28T01:30:13Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Setting Up The Working Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Infobox inst&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110557</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110557"/>
		<updated>2017-10-28T01:27:51Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Setting Up The Working Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Quote Box&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110550</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110550"/>
		<updated>2017-10-28T01:21:12Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110548</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110548"/>
		<updated>2017-10-28T01:20:35Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110547</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110547"/>
		<updated>2017-10-28T01:19:55Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Create method has been split into two methods create and save_questionnaire_create&lt;br /&gt;
&lt;br /&gt;
'''Before Modification:'''&lt;br /&gt;
  def create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    begin&lt;br /&gt;
      @questionnaire.private = questionnaire_private&lt;br /&gt;
      @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
      @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
      @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
      @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
      @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
      # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
      # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
      case display_type&lt;br /&gt;
      when 'AuthorFeedback'&lt;br /&gt;
        display_type = 'Author%Feedback'&lt;br /&gt;
      when 'CourseSurvey'&lt;br /&gt;
        display_type = 'Course%Survey'&lt;br /&gt;
      when 'TeammateReview'&lt;br /&gt;
        display_type = 'Teammate%Review'&lt;br /&gt;
      when 'GlobalSurvey'&lt;br /&gt;
        display_type = 'Global%Survey'&lt;br /&gt;
      when 'AssignmentSurvey'&lt;br /&gt;
        display_type = 'Assignment%Survey'&lt;br /&gt;
      end&lt;br /&gt;
      @questionnaire.display_type = display_type&lt;br /&gt;
      @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
      @questionnaire.save&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
'''After Modification:'''&lt;br /&gt;
&lt;br /&gt;
  def create&lt;br /&gt;
    begin&lt;br /&gt;
      save_questionnaire_create&lt;br /&gt;
      # Create node&lt;br /&gt;
      tree_folder = TreeFolder.where(['name like ?', @questionnaire.display_type]).first&lt;br /&gt;
      parent = FolderNode.find_by_node_object_id(tree_folder.id)&lt;br /&gt;
      QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id, type: 'QuestionnaireNode')&lt;br /&gt;
      flash[:success] = 'You have successfully created a questionnaire!'&lt;br /&gt;
    rescue&lt;br /&gt;
      flash[:error] = $ERROR_INFO&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'questionnaires', action: 'edit', id: @questionnaire.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def save_questionnaire_create&lt;br /&gt;
    questionnaire_private = params[:questionnaire][:private] == &amp;quot;true&amp;quot; ? true : false&lt;br /&gt;
    display_type = params[:questionnaire][:type].split('Questionnaire')[0]&lt;br /&gt;
    if Questionnaire::QUESTIONNAIRE_TYPES.include? params[:questionnaire][:type]&lt;br /&gt;
      @questionnaire = Object.const_get(params[:questionnaire][:type]).new&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.private = questionnaire_private&lt;br /&gt;
    @questionnaire.name = params[:questionnaire][:name]&lt;br /&gt;
    @questionnaire.instructor_id = session[:user].id&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.type = params[:questionnaire][:type]&lt;br /&gt;
    # Zhewei: Right now, the display_type in 'questionnaires' table and name in 'tree_folders' table are not consistent.&lt;br /&gt;
    # In the future, we need to write migration files to make them consistency.&lt;br /&gt;
    case display_type&lt;br /&gt;
    when 'AuthorFeedback'&lt;br /&gt;
      display_type = 'Author%Feedback'&lt;br /&gt;
    when 'CourseSurvey'&lt;br /&gt;
      display_type = 'Course%Survey'&lt;br /&gt;
    when 'TeammateReview'&lt;br /&gt;
      display_type = 'Teammate%Review'&lt;br /&gt;
    when 'GlobalSurvey'&lt;br /&gt;
      display_type = 'Global%Survey'&lt;br /&gt;
    when 'AssignmentSurvey'&lt;br /&gt;
      display_type = 'Assignment%Survey'&lt;br /&gt;
    end&lt;br /&gt;
    @questionnaire.display_type = display_type&lt;br /&gt;
    @questionnaire.instruction_loc = Questionnaire::DEFAULT_QUESTIONNAIRE_URL&lt;br /&gt;
    @questionnaire.save&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110541</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110541"/>
		<updated>2017-10-28T01:15:44Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Create method has been split into two methods &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Refactoring'''&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110531</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110531"/>
		<updated>2017-10-28T01:10:19Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Testing'''&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110530</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110530"/>
		<updated>2017-10-28T01:09:48Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110528</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110528"/>
		<updated>2017-10-28T01:09:18Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110527</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110527"/>
		<updated>2017-10-28T01:08:47Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
*Testing&lt;br /&gt;
*Refactoring&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110520</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110520"/>
		<updated>2017-10-28T01:00:31Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
  describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 1,&lt;br /&gt;
          pid: 1&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page' do&lt;br /&gt;
        params = {&lt;br /&gt;
          id: 3,&lt;br /&gt;
          pid: 1,&lt;br /&gt;
          save: true,&lt;br /&gt;
          questionnaire: {&lt;br /&gt;
            name: 'test questionnaire',&lt;br /&gt;
            instructor_id: 6,&lt;br /&gt;
            private: 0,&lt;br /&gt;
            min_question_score: 0,&lt;br /&gt;
            max_question_score: 5,&lt;br /&gt;
            type: 'ReviewQuestionnaire',&lt;br /&gt;
            display_type: 'Review',&lt;br /&gt;
            instructor_loc: ''&lt;br /&gt;
          },&lt;br /&gt;
          question: {&lt;br /&gt;
            '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
            '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
            '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
          },&lt;br /&gt;
          quiz_question_choices: {&lt;br /&gt;
            '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
                    {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
            '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
            '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
                    {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
                     '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        get :update_quiz, params&lt;br /&gt;
        response.should redirect_to(view_submitted_content_index_path(id: params[:pid]))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110519</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110519"/>
		<updated>2017-10-28T00:59:35Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
   describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110518</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110518"/>
		<updated>2017-10-28T00:59:09Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
describe '#update_quiz' do&lt;br /&gt;
    context 'when @questionnaire is nil' do&lt;br /&gt;
      it 'redirects to submitted_content#view page'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    context 'when @questionnaire is not nil' do&lt;br /&gt;
      it 'updates all quiz questions and redirects to submitted_content#view page'&lt;br /&gt;
        # params = {&lt;br /&gt;
        #   id: 1,&lt;br /&gt;
        #   pid: 1,&lt;br /&gt;
        #   save: true,&lt;br /&gt;
        #   questionnaire: {&lt;br /&gt;
        #     name: 'test questionnaire',&lt;br /&gt;
        #     instructor_id: 6,&lt;br /&gt;
        #     private: 0,&lt;br /&gt;
        #     min_question_score: 0,&lt;br /&gt;
        #     max_question_score: 5,&lt;br /&gt;
        #     type: 'ReviewQuestionnaire',&lt;br /&gt;
        #     display_type: 'Review',&lt;br /&gt;
        #     instructor_loc: ''&lt;br /&gt;
        #   },&lt;br /&gt;
        #   question: {&lt;br /&gt;
        #     '1' =&amp;gt; {txt: 'Q1'},&lt;br /&gt;
        #     '2' =&amp;gt; {txt: 'Q2'},&lt;br /&gt;
        #     '3' =&amp;gt; {txt: 'Q3'}&lt;br /&gt;
        #   },&lt;br /&gt;
        #   quiz_question_choices: {&lt;br /&gt;
        #     '1' =&amp;gt; {MultipleChoiceRadio:&lt;br /&gt;
        #             {:correctindex =&amp;gt; 1, '1' =&amp;gt; {txt: 'a11'}, '2' =&amp;gt; {txt: 'a12'}, '3' =&amp;gt; {txt: 'a13'}, '4' =&amp;gt; {txt: 'a14'}}},&lt;br /&gt;
        #     '2' =&amp;gt; {TrueFalse: {'1' =&amp;gt; {iscorrect: 'True'}}},&lt;br /&gt;
        #     '3' =&amp;gt; {MultipleChoiceCheckbox:&lt;br /&gt;
        #             {'1' =&amp;gt; {iscorrect: '1', txt: 'a31'}, '2' =&amp;gt; {iscorrect: '0', txt: 'a32'},&lt;br /&gt;
        #              '3' =&amp;gt; {iscorrect: '1', txt: 'a33'}, '4' =&amp;gt; {iscorrect: '0', txt: 'a34'}}}&lt;br /&gt;
        #   }&lt;br /&gt;
        # }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110516</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110516"/>
		<updated>2017-10-28T00:58:18Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
      it 'redirects to questionnaires#edit page after create a new questionnaire'&lt;br /&gt;
    end&lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
   describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110510</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110510"/>
		<updated>2017-10-28T00:56:48Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110507</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110507"/>
		<updated>2017-10-28T00:56:17Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
After writing test case&lt;br /&gt;
    describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110505</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110505"/>
		<updated>2017-10-28T00:55:27Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
describe '#create' do&lt;br /&gt;
    it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      tree_folder1 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      tree_folder2 = double('TreeFolder')&lt;br /&gt;
      allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      folder_node2 = double('FolderNode')&lt;br /&gt;
      allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      params = {&lt;br /&gt;
        questionnaire: {&lt;br /&gt;
          private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          max_question_score: &amp;quot;5&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      session = {user: user}&lt;br /&gt;
      get :create, params, session&lt;br /&gt;
      expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110504</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110504"/>
		<updated>2017-10-28T00:52:48Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
::describe '#create' do &amp;lt;br&amp;gt;&lt;br /&gt;
    ::it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      :::tree_folder1 = double('TreeFolder')&lt;br /&gt;
      :::allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      :::allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      :::tree_folder2 = double('TreeFolder')&lt;br /&gt;
      :::allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      :::allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      :::allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      :::folder_node2 = double('FolderNode')&lt;br /&gt;
      :::allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      :::allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      :::user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      :::allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      :::params = {&lt;br /&gt;
        ::::questionnaire: {&lt;br /&gt;
          :::::private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          :::::type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          :::::name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          :::::min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          :::::max_question_score: &amp;quot;5&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
        }&amp;lt;br&amp;gt;&lt;br /&gt;
      }&amp;lt;br&amp;gt;&lt;br /&gt;
      ::::session = {user: user}&lt;br /&gt;
      ::::get :create, params, session&lt;br /&gt;
      ::::expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      ::::response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    :::end&lt;br /&gt;
  ::end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110503</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110503"/>
		<updated>2017-10-28T00:52:14Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
::describe '#create' do&lt;br /&gt;
    ::it 'redirects to questionnaires#edit page after create a new questionnaire' do&lt;br /&gt;
      :::tree_folder1 = double('TreeFolder')&lt;br /&gt;
      :::allow(tree_folder1).to receive(:id).and_return(1)&lt;br /&gt;
      :::allow(tree_folder1).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      :::tree_folder2 = double('TreeFolder')&lt;br /&gt;
      :::allow(tree_folder2).to receive(:id).and_return(1)&lt;br /&gt;
      :::allow(tree_folder2).to receive(:node_object_id).and_return(1)&lt;br /&gt;
      :::allow(TreeFolder).to receive(:where).with([&amp;quot;name like ?&amp;quot;, &amp;quot;Review&amp;quot;]).and_return([tree_folder1, tree_folder2])&lt;br /&gt;
      :::folder_node2 = double('FolderNode')&lt;br /&gt;
      :::allow(folder_node2).to receive(:id).and_return(1)&lt;br /&gt;
      :::allow(FolderNode).to receive(:find_by_node_object_id).and_return(folder_node2)&lt;br /&gt;
      :::user = double(&amp;quot;User&amp;quot;)&lt;br /&gt;
      :::allow(user).to receive(:id).and_return(1)&lt;br /&gt;
      :::params = {&lt;br /&gt;
        ::::questionnaire: {&lt;br /&gt;
          :::::private: &amp;quot;true&amp;quot;,&lt;br /&gt;
          :::::type: &amp;quot;ReviewQuestionnaire&amp;quot;,&lt;br /&gt;
          :::::name: &amp;quot;Random Name&amp;quot;,&lt;br /&gt;
          :::::min_question_score: &amp;quot;0&amp;quot;,&lt;br /&gt;
          :::::max_question_score: &amp;quot;5&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
        }&amp;lt;br&amp;gt;&lt;br /&gt;
      }&amp;lt;br&amp;gt;&lt;br /&gt;
      ::::session = {user: user}&lt;br /&gt;
      ::::get :create, params, session&lt;br /&gt;
      ::::expect(flash[:success]).to eq(&amp;quot;You have successfully created a questionnaire!&amp;quot;)&lt;br /&gt;
      ::::response.should redirect_to(edit_questionnaire_path(id: 1))&lt;br /&gt;
    :::end&lt;br /&gt;
  ::end&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110498</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110498"/>
		<updated>2017-10-28T00:46:19Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
[[File:create-after1.png]] &lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;br /&gt;
&lt;br /&gt;
[[File:Update_quiz-after.png]]&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Update_quiz-after.png&amp;diff=110496</id>
		<title>File:Update quiz-after.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Update_quiz-after.png&amp;diff=110496"/>
		<updated>2017-10-28T00:46:01Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110492</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110492"/>
		<updated>2017-10-28T00:43:44Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
[[File:create-after1.png]] &lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(2).PNG‎]]&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Update_quiz-before(2).PNG&amp;diff=110490</id>
		<title>File:Update quiz-before(2).PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Update_quiz-before(2).PNG&amp;diff=110490"/>
		<updated>2017-10-28T00:43:10Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110489</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110489"/>
		<updated>2017-10-28T00:42:19Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
[[File:create-after1.png]] &lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
[[File:Update_quiz-before(1).PNG‎]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Update_quiz-before(1).PNG&amp;diff=110487</id>
		<title>File:Update quiz-before(1).PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Update_quiz-before(1).PNG&amp;diff=110487"/>
		<updated>2017-10-28T00:41:36Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110486</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110486"/>
		<updated>2017-10-28T00:40:40Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
[[File:create-after1.png]] &lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110484</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110484"/>
		<updated>2017-10-28T00:40:00Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
[[File:create-after.png]] &lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Create-after1.png&amp;diff=110483</id>
		<title>File:Create-after1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Create-after1.png&amp;diff=110483"/>
		<updated>2017-10-28T00:39:34Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110477</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110477"/>
		<updated>2017-10-28T00:34:20Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
 [[Image:create-after.png]]&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110475</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110475"/>
		<updated>2017-10-28T00:33:24Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
 [[Image:create-after.png|150px]]&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110471</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110471"/>
		<updated>2017-10-28T00:32:33Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
 [[Image:create-after.png|150px] ]&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110469</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110469"/>
		<updated>2017-10-28T00:31:46Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
 [[Image:create-after.png | 150px] ]&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110464</id>
		<title>CSC/ECE 517 Fall 2017/E1749 questionnaire controller.rb refactor</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2017/E1749_questionnaire_controller.rb_refactor&amp;diff=110464"/>
		<updated>2017-10-28T00:30:15Z</updated>

		<summary type="html">&lt;p&gt;Dbhanda: /* Tasks Completed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About ==&lt;br /&gt;
Expertiza is a website that is used and developed by NCSU students and faculty. Coded using Ruby on Rails the source code is readily available on Github -&amp;gt; https://github.com/expertiza/expertiza. The website is used by students for organizing teams, signing up for topics, reviewing other teams and  another bunch of tasks. The faculty i.e. Instructors and TAs use this website to set new tasks, add new questions and a few other tasks.&lt;br /&gt;
&lt;br /&gt;
== Team Members ==&lt;br /&gt;
&lt;br /&gt;
*Shreyas Zagade&lt;br /&gt;
*Mohit Satarkar&lt;br /&gt;
*Darshan Bhandari&lt;br /&gt;
&lt;br /&gt;
==  Setting Up The Working Environment ==&lt;br /&gt;
''One of several ways to set up the environment and the one we adopted is:-'' &amp;lt;br&amp;gt;&lt;br /&gt;
'''Ubuntu-Expertiza image (.OVA) [Recommended]''' &amp;lt;br&amp;gt;&lt;br /&gt;
:This is the link for the image. (https://drive.google.com/a/ncsu.edu/file/d/0B2vDvVjH76uEUmNKVncxRUhUVVE/view?usp=sharing) &amp;lt;br&amp;gt;&lt;br /&gt;
:And you can install VirtualBox (free) and import this image into VirtualBox. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Some machine may require you to enable virtualization and then run the following commands.'''&amp;lt;br&amp;gt;&lt;br /&gt;
•	cd expertiza &amp;lt;br&amp;gt;&lt;br /&gt;
•	bash ./setup.sh &amp;lt;br&amp;gt;&lt;br /&gt;
•	bundle install &amp;lt;br&amp;gt;&lt;br /&gt;
•	rake db:migrate &amp;lt;br&amp;gt;&lt;br /&gt;
*For logging in as an instructor:- &amp;lt;br&amp;gt;&lt;br /&gt;
:Username: instructor6 &amp;lt;br&amp;gt;&lt;br /&gt;
:Password: password &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files involved and Issues in them==&lt;br /&gt;
&lt;br /&gt;
1) questionnaire_controller.rb &amp;lt;br&amp;gt;&lt;br /&gt;
2) questionnaire_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
•	questionnaires_controller.rb is a fairly complex file. &amp;lt;br&amp;gt;&lt;br /&gt;
•	It contains a lot of methods that are long and hard to understand, these methods need to be broken down into simpler and more specific methods that are easier to read/understand. &amp;lt;br&amp;gt;&lt;br /&gt;
•	Also, the few instances of code duplication that exist should be removed.&lt;br /&gt;
&lt;br /&gt;
== Tasks assigned ==&lt;br /&gt;
1)	Complete pending tests in questionnaires_controller_spec.rb, and write integration tests for newly-created methods. Please finish one set of pending tests first before refactoring corresponding methods. &amp;lt;br&amp;gt;&lt;br /&gt;
2)	Refactor create method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Split into several simpler methods and assign reasonable names &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Extract duplicated code into separate methods &amp;lt;br&amp;gt;&lt;br /&gt;
3)	Refactor update_quiz, save_choices method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first. &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Use polymorphism to replace the long switch statements &amp;lt;br&amp;gt;&lt;br /&gt;
::	Move if conditions to corresponding subclasses (eg. MultipleChoiceCheckbox.rb, MultipleChoiceRadio.rb) with same method name &amp;lt;br&amp;gt;&lt;br /&gt;
::	Replace the conditional with the relevant method calls &amp;lt;br&amp;gt;&lt;br /&gt;
::	Remove duplicated code &amp;lt;br&amp;gt;&lt;br /&gt;
4)	Use find_by instead of dynamic method &amp;lt;br&amp;gt;&lt;br /&gt;
:o	Write failing tests first &amp;lt;br&amp;gt;&lt;br /&gt;
:o	L68, L385, L386, L559, L560 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Tasks Completed  ==&lt;br /&gt;
&lt;br /&gt;
1)	Completed test cases for create &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
[[File:Create-before.PNG]] &lt;br /&gt;
  &lt;br /&gt;
:After writing test case&lt;br /&gt;
 [[File:create-after.png] upright=0.75]&lt;br /&gt;
&lt;br /&gt;
2)	Completed test cases for update_quiz &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:When test case was pending&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:After writing test case&lt;/div&gt;</summary>
		<author><name>Dbhanda</name></author>
	</entry>
</feed>