require "rails_helper"

describe "Poll question options", :admin do
  let(:future_poll) { create(:poll, :future) }
  let(:current_poll) { create(:poll) }

  describe "Create" do
    scenario "Is possible for a not started poll" do
      question = create(:poll_question, poll: future_poll)

      visit admin_question_path(question)
      click_link "Add answer"

      expect(page).to have_link "Go back", href: admin_question_path(question)

      fill_in "Answer", with: "The answer is always 42"
      fill_in_ckeditor "Description", with: "The Hitchhiker's Guide To The Universe"

      click_button "Save"

      expect(page).to have_content "Answer created successfully"
      expect(page).to have_content "The answer is always 42"
      expect(page).to have_content "The Hitchhiker's Guide To The Universe"
    end

    scenario "Is not possible for an already started poll" do
      question = create(:poll_question, poll: current_poll)

      visit admin_question_path(question)

      expect(page).not_to have_link "Add answer"
      expect(page).to have_content "Once the poll has started it will not be possible to create, edit or"
    end

    scenario "Create second answer and place after the first one" do
      question = create(:poll_question, poll: future_poll)
      create(:poll_question_option, title: "First", question: question, given_order: 1)

      visit admin_question_path(question)
      click_link "Add answer"

      fill_in "Answer", with: "Second"
      fill_in_ckeditor "Description", with: "Description"

      click_button "Save"

      expect("First").to appear_before("Second")
    end
  end

  scenario "Update" do
    question = create(:poll_question, poll: future_poll)
    create(:poll_question_option, question: question, title: "Answer title", given_order: 2)
    create(:poll_question_option, question: question, title: "Another title", given_order: 1)

    visit admin_question_path(question)
    within("tr", text: "Answer title") { click_link "Edit" }

    expect(page).to have_link "Go back", href: admin_question_path(question)

    fill_in "Answer", with: "New title"
    click_button "Save"

    expect(page).to have_content "Changes saved"
    expect(page).to have_content "New title"

    refresh

    expect(page).not_to have_content "Changes saved"
    expect(page).not_to have_content "Answer title"

    expect("Another title").to appear_before("New title")
  end

  scenario "Destroy" do
    option = create(:poll_question_option, poll: future_poll, title: "I'm not useful")

    visit admin_question_path(option.question)

    within("tr", text: "I'm not useful") do
      accept_confirm("Are you sure? This action will delete \"I'm not useful\" and can't be undone.") do
        click_button "Delete"
      end
    end

    expect(page).to have_content "Answer deleted successfully"
    expect(page).not_to have_content "I'm not useful"
  end

  scenario "Reorder" do
    question = create(:poll_question)
    create(:poll_question_option, question: question, title: "First", given_order: 1)
    create(:poll_question_option, question: question, title: "Last", given_order: 2)

    visit admin_question_path(question)

    within(".poll-question-options-table tbody") do
      expect("First").to appear_before("Last")

      find("tr", text: "Last").drag_to(find("tr", text: "First"))

      expect("Last").to appear_before("First")
    end
  end
end
