require 'test_helper' class NotesControllerTest < ActionDispatch::IntegrationTest include Devise::Test::IntegrationHelpers setup do @user = User.last scaffold_plan # Assign the user to the plan as a commenter/reader @plan.assign_reader(@user.id) @plan.save! @question = Question.create(text: 'Answer Testing', number: 9, section: @plan.template.phases.first.sections.first, question_format: QuestionFormat.find_by(option_based: false)) @answer = Answer.create(user: @user, plan: @plan, question: @question, text: 'Testing') @note = Note.create(user: @user, plan: @plan, answer: @answer, question: @question, archived: false, text: 'Test Note') end # TODO: The following methods SHOULD probably be restful # # SHOULD BE: # -------------------------------------------------- # notes GET /answers/:answer_id/notes notes#index # POST /answers/:answer_id/notes notes#create # note GET /answers/:answer_id/notes/:id notes#show # PATCH /answers/:answer_id/notes/:id notes#update # PUT /answers/:answer_id/notes/:id notes#update # DELETE /answers/:answer_id/notes/:id notes#destroy # # CURRENT RESULTS OF `rake routes` # -------------------------------------------------- # archive_note PATCH /notes/:id/archive notes#archive # notes POST /notes notes#create # note PATCH /notes/:id notes#update # PUT /notes/:id notes#update # POST /notes (notes_path) # ---------------------------------------------------------- test "create a new note" do params = {user_id: @user.id, answer_id: @answer.id, plan_id: @plan.id, question_id: @question.id, text: 'Test Note'} # Should redirect user to the root path if they are not logged in! post notes_path, {note: params} assert_unauthorized_redirect_to_root_path sign_in @user post notes_path, {note: params}, {'ACCEPT': 'application/json'} assert_response :success assert assigns(:note) assert assigns(:plan) assert assigns(:answer) assert assigns(:question) assert assigns(:notice) #assert_select '.welcome-message h2', _('Comment was successfully created.') assert_equal 'Test Note', Note.last.text, 'Expected the note to have been created' # No Answer post notes_path, {note: {user_id: @user.id, plan_id: @plan.id, question_id: @question.id}}, {'ACCEPT': 'application/json'} assert_response :bad_request # TODO: expected the new note to have been added :/ #assert_equal 'Test Note no Answer', Note.last.text, 'Expected the note to have been created even if there was no answer' # Invalid object post notes_path, {note: {user_id: @user.id, answer_id: @answer.id, plan_id: @plan.id, question_id: @question.id}}, {'ACCEPT': 'application/json'} assert_response :bad_request assert assigns(:note) assert assigns(:plan) assert assigns(:answer) assert assigns(:question) assert assigns(:notice) end # PUT /notes/:id (note_path) # ---------------------------------------------------------- test "update the note" do # Should redirect user to the root path if they are not logged in! put note_path(@note), { note: { text: 'Test Note' }, id: @note.id }, {'ACCEPT': 'application/json'} assert_unauthorized_redirect_to_root_path sign_in @user # Valid save put note_path(@note), { note: {text: 'Test Note' }, id: @note.id }, {'ACCEPT': 'application/json'} assert_response :success assert assigns(:note) assert assigns(:plan) assert assigns(:answer) assert assigns(:question) assert assigns(:notice) @note.reload assert_equal 'Test Note', @note.text, "expected the note's text to be 'Test Note'" # Invalid save put note_path(@note), { note: { text: nil }, id: @note.id }, {'ACCEPT': 'application/json'} assert_response :bad_request assert assigns(:notice) assert_equal 'Test Note', @note.text, "expected the note's text to Still be 'Test Note'" end # PATCH /notes/:id/archive (archive_note_path) # ---------------------------------------------------------- test "delete the note" do # Should redirect user to the root path if they are not logged in! patch archive_note_path(@note), { note: { archived_by: @user.id }, id: @note.id }, {'ACCEPT': 'application/json'} assert_unauthorized_redirect_to_root_path sign_in @user patch archive_note_path(@note), { note: { archived_by: @user.id }, id: @note.id }, {'ACCEPT': 'application/json'} assert_response :success assert assigns(:note) assert assigns(:plan) assert assigns(:answer) assert assigns(:question) assert assigns(:notice) @note.reload assert @note.archived, 'expected the archived flag to be true' assert_equal @user.id, @note.archived_by, 'expected the archived_by to be set to @user' end end