CSC/ECE 517 Spring 2022 - E2201: Testing for assignment questionnaire controller.rb: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 110: Line 110:
</pre>
</pre>


=== paginate_list ===
=== create ===
This method is also private and needs to be tested through list action. The parameter paginate_options which decides the execution of statement we need to test is predefined in the paginate_list, and thus the required statement cannot be accessed or tested. So, we tested the other statements in the method.
This method is used to create an AssignmentQuestionnaire entry. But first, the testing file below verifies that there is not a missing assignment id when creating an entry. This testing confirmed that the assignment_questionnaire_controller.rb file needed to be updated to remove a portion of the proposed error flash that was unable to convert a nil value to a string in the case of a missing assignment_id. This was the same result for in the case of a missing questionnaire_id.


<pre>
<pre>
   context '#list' do
   context 'when assignment id is not entered' do
    it 'checks that paginate_list does not fail with controller' do
        it 'flashes a response of missing assignment id' do
      expect{controller.list}.not_to raise_error
          session = { user: super_admin}
    end
          params = { :assignment_id => nil}
 
          get :create, params, session
    it 'checks that paginate_list does not fail with post' do
          # expect(flash[:error]).to eq('Missing assignment:' + params[:assigment_id])
      post :list
          expect(flash[:error]).to be_present
      expect(response.status).to eq(200)
        end
    end
      end
  end
</pre>
</pre>


== Conclusion ==
== Conclusion ==
The users_controller has been thoroughly tested in its present state. The auto_complete_result method in auto_complete_for_user_name method needs to be defined. Further, the paginate_list method needs to be refactored so that all statements in the method are accessible and may be tested.
The assignment_questionnaire_controller has been thoroughly tested in its present state. An error was found in the controller to include a flash message for both the case of a missing assignment_id and missing questionnaire_id where a nil value was attempting to be converted to a string.


== Related Links ==
== Related Links ==

Revision as of 02:59, 22 March 2022

About Expertiza

Expertiza is the software benefits for both instructors and students by supporting various types of submissions and providing reusable objects for peer review. It is an open-source project based on Ruby on Rails framework. It allows the instructors not only to create and customize new or existing assignments but also to create a list of topics the students can sign up for. Students can form teams to work on various projects and assignments. Expertiza also lets students peer-review other students' submissions, enabling them to work together to improve others' learning experiences.

Current Project Description

This Expertiza OSS project "E2201: Testing for assignment_questionnaire_controller" is focused on adding unit tests for assignment_questionnaire_controller.rb.

Files Involved

  • assignment_questionnaire_controller.rb
  • assignment_questionnaire_controller_spec.rb

Running Tests

  rspec ./spec/controllers/assignment_questionnaire_controller_spec.rb

Testing

assignment_questionnaire_controller had 3 methods for which unit tests were missing as seen in this coverall. The RSpec unit tests added for these methods in the spec file 'assignment_questionnaire_controller_spec.rb' are discussed below.

action_allowed?

This method checks if a particular action is allowed when it is called for the Assignment. The action is passed in the params. In this case we are testing the action list_pending_requested. For the controller tested, there were 4 contexts to test. The first being when there is not an assignment associated with the assignment id, the action should not be allowed and returns false. Next, a stub instructor was created to verify if the action would also be false for when an instructor of the assignment was the current user. Similarly this was done for finding if the user was the ancestor of the assignment and this would return true. And again this was done for the case if the assignment's course's ta is the same ta who signed in.

    context 'when no assignment is associated with the id' do
      it 'refuses certain action' do
        allow(Assignment).to receive(:find).and_return(nil)
        expect(controller.send(:action_allowed?)).to be_falsey
      end
    end

    context 'instructor is the parent of the assignment found' do
      it 'allows a certain action' do
        stub_current_user(instructor1, instructor1.role.name, instructor1.role)
        allow(Assignment).to receive(:find).and_return(assignment)
        allow_any_instance_of(Assignment).to receive(:instructor).and_return(instructor1)
        expect(controller.send(:action_allowed?)).to be_falsey
      end
    end
    
    context 'user is the ancestor of the assignment found' do
      ##Assert if the user, who is the ancestor of the instructor who created the course, is allowed to perform the action. 
      it 'allows a certain action' do
        stub_current_user(super_admin, super_admin.role.name, super_admin.role)
        allow(Assignment).to receive(:find).and_return(assignment3)
        allow_any_instance_of(Assignment).to receive(:instructor).and_return(instructor1)
        expect(controller.send(:action_allowed?)).to be_truthy
      end
    end

    context 'course ta is allowed to perform actions on the assignment found' do
      ##Created an assignment for a course
      ##Assigned a ta to that course
      ##Assert if this assignment's course's ta is the same guy who signed in. 
      it 'allows a certain action' do
        ta1 = create(:teaching_assistant, id: 25)
        ta2 = create(:teaching_assistant, id:40, name: 'test_ta_2')
        course1 = create(:course)
        assignment4 = create(:assignment, course_id: course1.id, instructor_id: instructor1)
        TaMapping.create(ta_id: ta1.id, course_id: course1.id)
        
        stub_current_user(ta2, ta2.role.name, ta2.role)
        allow(Assignment).to receive(:find).and_return(assignment4)
        expect(controller.send(:action_allowed?)).to be false
      end

    end

delete_all

This action is called in the process of deleting an assignment_questionnaire that is associated with an assignment. When this action is successfully executed or the questionnaire is successfully destroyed upon an assignment's deletion, then the test below tests to see that the AssignmentQuestionnaire table is updated to reflect this deltion. Furthermore, the tests below verify that a error flash is present if there is no such assignment_id associated with the requested assignment to be deleted.

   context 'when no assignment is associated with the id in the database' do
      it 'refuses certain action' do
        params = {:assignment_id => 20}
        session = { user: super_admin }

        allow(Assignment).to receive(:find).with('20').and_return(nil)
        post :delete_all, params, session
        expect(flash[:error]).to be_present
        # expect(flash[:error]).to eq('Assignment #' + params[:assignment_id].to_s + ' does not currently exist.')
      end
    end
  end

    context 'when questionnaires related to an assignment are deleted' do
      it 'should persist that delete in the database' do
        assignment5 = create(:assignment)

        questionnaire1 = create(:questionnaire)
        questionnaire2 = create(:questionnaire)
        questionnaire3 = create(:questionnaire)

        assignment_questionnaire1 = create(:assignment_questionnaire, assignment_id: assignment5.id, questionnaire_id: questionnaire1.id)
        assignment_questionnaire2 = create(:assignment_questionnaire, assignment_id: assignment5.id, questionnaire_id: questionnaire2.id)
        assignment_questionnaire3 = create(:assignment_questionnaire, assignment_id: assignment5.id, questionnaire_id: questionnaire3.id)

        allow(Assignment).to receive(:find).and_return(assignment5)
        allow(controller).to receive(:params).and_return({assignment_id: assignment5.id})
        controller.send(:delete_all)

        expect(AssignmentQuestionnaire.where(assignment_id: assignment5.id).count).to eq(0)

      end
    end

create

This method is used to create an AssignmentQuestionnaire entry. But first, the testing file below verifies that there is not a missing assignment id when creating an entry. This testing confirmed that the assignment_questionnaire_controller.rb file needed to be updated to remove a portion of the proposed error flash that was unable to convert a nil value to a string in the case of a missing assignment_id. This was the same result for in the case of a missing questionnaire_id.

  context 'when assignment id is not entered' do
        it 'flashes a response of missing assignment id' do
          session = { user: super_admin}
          params = { :assignment_id => nil}
          get :create, params, session
          # expect(flash[:error]).to eq('Missing assignment:' + params[:assigment_id])
          expect(flash[:error]).to be_present
        end
      end

Conclusion

The assignment_questionnaire_controller has been thoroughly tested in its present state. An error was found in the controller to include a flash message for both the case of a missing assignment_id and missing questionnaire_id where a nil value was attempting to be converted to a string.

Related Links

The main repository can be found here.

The forked git repository for this project can be found here.

A video of all tests running can be seen here.