Redirect_to войти на страницу, если вызов AJAX не авторизован - PullRequest
1 голос
/ 20 марта 2019

У меня есть форма, и когда вы нажимаете submit, она выполняет вызов AJAX, чтобы обновить то, что вы хотите изменить. Мой пользовательский сеанс истекает через 4 часа, поэтому, если пользователь хочет обновить форму, а его сеанс истек в это время, он выдаст флэш-сообщение с просьбой перезагрузить страницу и войти снова.

При попытке проверить это поведение с помощью Cucumber, Capybara, Selenium и Chrome ответ AJAX никогда не принимается, поскольку флэш-сообщение не отображается. (Если я проверю его вручную, он будет работать нормально)

Я запустил еще один тест, который отображает флэш-сообщение при выполнении другого действия, которое также использует AJAX, и оно успешно выполнено. Разница в том, что одно действие сразу отображает представление, а неудачное перенаправляет на другой путь, а затем выполняет рендеринг. Все контроллеры наследуются от одного и того же BaseController, который проверяет, авторизован ли пользователь.

После окончания сеанса я вызываю форму отправки, которая имеет следующие шаги:

When /^I submit the form$/ do
  generic_form_page = GenericFormPage.new(Capybara.current_session)
  generic_form_page.submit

  if Capybara.current_session.mode == :poltergeist
    ajax_page = GenericAjaxPage.new Capybara.current_session
    ajax_page.wait_for_ajax_call_to_finish
  else
    Selenium::WebDriver::Wait.new(:timeout => 50)
  end
  sleep 5
end

wait_for_ajax_call_to_finish в основном просто спит пару секунд

Это действие, которое терпит неудачу:

  def update
    @element = Element.find(params[:id])
    if @element.update_attributes(element_params)
      render :json => { :location => another_path(@element.item) }
    else
      render :action => 'edit', :layout => false
    end
  end

Действие, которое следует за:

  def edit
    @element = Element.find(params[:id])
    @item = @element.item
    render :layout => false
  end

Сообщение AJAX выглядит так:

handle_ajax_errors = (event, request, settings) ->
  if request.status == 401
    render_flash_error_message("Your session has timed out. Please refresh the page.")
  else
    render_flash_error_message("We're sorry. An error has occurred.")

Вот как у меня заканчиваются файлы cookie:

browser = Capybara.current_session.driver.browser
  if browser.respond_to?(:clear_cookies)
    # Rack::MockSession
    browser.clear_cookies
  elsif browser.respond_to?(:manage) and browser.manage.respond_to?(:delete_all_cookies)
    # Selenium::WebDriver
    browser.manage.delete_all_cookies
  else
    raise "Don't know how to clear cookies. Weird driver?"
  end

Спасибо!

...