features/step_definitions/custom_web_steps.rb
# frozen_string_literal: true

module ScreenshotCukeHelpers

  def set_screenshot_location(path)
    @screenshot_path = Rails.root.join('tmp','screenshots', path)
    @screenshot_path.mkpath unless @screenshot_path.exist?
  end

  def take_screenshot(name, path)
    visit send("#{path}_path")
    browser = page.driver.browser
    pic = @screenshot_path.join("#{name}.png")

    sleep 0.5

    page.driver.resize(1280, 1024)
    save_screenshot(pic)
  end

  def take_screenshots_without_login
    pages = {
      'register' => 'new_user_registration',
      'login'    => 'user_session'
    }

    pages.each do |name, path|
      take_screenshot name, path
    end
  end

  def take_screenshots_with_login
    pages = {
      "stream"        => "stream",
      "activity"      => "activity_stream",
      "mentions"      => "mentioned_stream",
      "aspects"       => "aspects_stream",
      "tags"          => "followed_tags_stream",
      "contacts"      => "contacts",
      "settings"      => "edit_user",
      "notifications" => "notifications",
      "conversations" => "conversations"
    }

    pages.each do |name, path|
      take_screenshot name, path
    end
  end

end
World(ScreenshotCukeHelpers)


When /^(.*) in the header$/ do |action|
  within('header') do
    step action
  end
end

And /^I submit the form$/ do
  find("input[type='submit']").click
end

Then /^the text area wrapper mobile should be with attachments$/ do
  find("#publisher-textarea-wrapper")["class"].should include("with_attachments")
end

And /^I want to mention (?:him|her) from the profile$/ do
  find('#mention_button').click
  within('#mentionModal') do
    click_publisher
  end
end

And /^I hover over the "([^"]+)"$/ do |element|
  find("#{element}", match: :first).hover
end

And /^I click on selector "([^"]*)"$/ do |selector|
  find(selector).click
end

And /^I click on the first selector "([^"]*)"$/ do |selector|
  find(selector, match: :first).click
end

And /^I confirm the alert after (.*)$/ do |action|
  accept_confirm do
    step action
  end
end

And /^I accept the alert after (.*)$/ do |action|
  accept_alert do
    step action
  end
end

And /^I confirm the prompt after (.*)$/ do |action|
  accept_prompt do
    step action
  end
end

And /^I reject the alert after (.*)$/ do |action|
  dismiss_confirm do
    step action
  end
end

And /^I should not see any alert after (.*)$/ do |action|
  expect {
    accept_alert do
      step action
    end
  }.to raise_error(Capybara::ModalNotFound)
end

When /^(.*) in the mention modal$/ do |action|
  within('#mentionModal') do
    step action
  end
end

When /^I press the first "([^"]*)"(?: within "([^"]*)")?$/ do |link_selector, within_selector|
  with_scope(within_selector) do
    current_scope.find(link_selector, match: :first).click
  end
end

When /^I press the ([\d])(?:nd|rd|st|th) "([^\"]*)"(?: within "([^\"]*)")?$/ do |number, link_selector, within_selector|
  with_scope(within_selector) do
    current_scope.find(:css, link_selector+":nth-child(#{number})").click
  end
end

Then /^(?:|I )should see a "([^\"]*)"(?: within "([^\"]*)")?$/ do |selector, scope_selector|
  with_scope(scope_selector) do
    expect(current_scope).to have_css(selector)
  end
end

Then /^I should see (\d+) "([^\"]*)"(?: within "([^\"]*)")?$/ do |count, selector, scope_selector|
  with_scope(scope_selector) do
    expect(current_scope).to have_selector(selector, count: count)
  end
end

Then /^(?:|I )should not see a "([^\"]*)"(?: within "([^\"]*)")?$/ do |selector, scope_selector|
  with_scope(scope_selector) do
    current_scope.should have_no_css(selector, :visible => true)
  end
end

Then /^page should (not )?have "([^\"]*)"$/ do |negate, selector|
  page.should ( negate ? (have_no_css(selector)) : (have_css(selector)) )
end

When /^I have turned off jQuery effects$/ do
  page.execute_script("$.fx.off = true")
end

Then /^the "([^"]*)" field(?: within "([^"]*)")? should be filled with "([^"]*)"$/ do |field, selector, value|
  with_scope(selector) do
    field = find_field(field)
    field_value = (field.tag_name == 'textarea') ? field.text : field.value
    field_value = field_value.first if field_value.is_a? Array
    field_value.should == value
  end
end

Then /^I should see (\d+) contacts$/ do |n_posts|
  has_css?("#people-stream .stream-element", count: n_posts.to_i).should be true
end

Then /^I should have scrolled down$/ do
  expect(page.evaluate_script("window.pageYOffset")).to be > 0
end

When /^I resize my window to 800x600$/ do
  page.driver.resize(800, 600)
end

And /^I wait for the popovers to appear$/ do
  expect(page).to have_selector(".popover", count: 3)
end

And /^I click close on all the popovers$/ do
  find(".popover .close", match: :first).click
  expect(page).to have_selector(".popover", count: 2, visible: false)
  find(".popover .close", match: :first).click
  expect(page).to have_selector(".popover", count: 1, visible: false)
  find(".popover .close", match: :first).click
  expect(page).to_not have_selector(".popover", visible: false)
end

Then /^I should see a flash message indicating success$/ do
  flash_message_success?.should be true
end

Then /^I should see a flash message indicating failure$/ do
  flash_message_failure?.should be true
end

Then /^I should not see a flash message indicating failure$/ do
  expect { flash_message_failure?.should }.to raise_error(Capybara::ElementNotFound)
end

Then /^I should see a flash message with a warning$/ do
  flash_message_alert?.should be true
end

Then /^I should see a flash message containing "(.+)"$/ do |text|
  flash_message_containing? text
end

Then /^I should see a success flash message containing "(.+)"$/ do |text|
  flash_message_success?.should be true
  flash_message_containing? text
end

Then /^I should see an error flash message containing "(.+)"$/ do |text|
  flash_message_failure?.should be true
  flash_message_containing? text
end

Given /^the reference screenshot directory is used$/ do
  set_screenshot_location 'reference'
end

Given /^the comparison screenshot directory is used$/ do
  set_screenshot_location 'current'
end

When /^I take the screenshots while logged out$/ do
  take_screenshots_without_login
end

When /^I take the screenshots while logged in$/ do
  take_screenshots_with_login
end

When /^I focus the "([^"]+)" field$/ do |field|
  find_field(field).click
end

Given /^"([^"]*)" is hidden$/ do |selector|
  page.should have_selector(selector, visible: false)
  page.should_not have_selector(selector)
end

Then(/^I should have a validation error on "(.*?)"$/) do |field_list|
  check_fields_validation_error field_list
end
