# frozen_string_literal: true
require 'spec_helper'
require 'capybara/minitest'
require 'capybara/minitest/spec'

class MinitestSpecTest < Minitest::Spec
  include ::Capybara::DSL
  include ::Capybara::Minitest::Assertions

  before do
    visit('/form')
  end
  after do
    Capybara.reset_sessions!
  end

  it "supports text expectations" do
    page.must_have_text('Form', minimum: 1)
    page.wont_have_text('Not a form')
    form = find(:css, 'form', text: 'Title')
    form.must_have_text('Customer Email')
    form.wont_have_text('Some other email')
  end

  it "supports current_path expectations" do
    page.must_have_current_path('/form')
    page.wont_have_current_path('/form2')
  end

  it "supports title expectations" do
    visit('/with_title')
    page.must_have_title('Test Title')
    page.wont_have_title('Not the title')
  end

  it "supports xpath expectations" do
    page.must_have_xpath('.//input[@id="customer_email"]')
    page.wont_have_xpath('.//select[@id="not_form_title"]')
    page.wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == "not_customer_email" }
    select = find(:select, 'form_title')
    select.must_have_xpath('.//option[@class="title"]')
    select.must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled?}
    select.wont_have_xpath('.//input[@id="customer_email"]')
  end

  it "support css expectations" do
    page.must_have_css('input#customer_email')
    page.wont_have_css('select#not_form_title')
    el = find(:select, 'form_title')
    el.must_have_css('option.title')
    el.wont_have_css('input#customer_email')
  end

  it "supports link expectations" do
    visit('/with_html')
    page.must_have_link('A link')
    page.wont_have_link('Not on page')
  end

  it "supports button expectations" do
    page.must_have_button('fresh_btn')
    page.wont_have_button('not_btn')
  end

  it "supports field expectations" do
    page.must_have_field('customer_email')
    page.wont_have_field('not_on_the_form')
  end

  it "supports select expectations" do
    page.must_have_select('form_title')
    page.wont_have_select('not_form_title')
  end

  it "supports checked_field expectations" do
    page.must_have_checked_field('form_pets_dog')
    page.wont_have_checked_field('form_pets_cat')
  end

  it "supports unchecked_field expectations" do
    page.must_have_unchecked_field('form_pets_cat')
    page.wont_have_unchecked_field('form_pets_dog')
  end

  it "supports table expectations" do
    visit('/tables')
    page.must_have_table('agent_table')
    page.wont_have_table('not_on_form')
  end

  it "supports all_of_selectors expectations" do
    page.must_have_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
  end

  it "supports none_of_selectors expectations" do
    page.must_have_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
  end

  it "supports match_selector expectations" do
    find(:field, 'customer_email').must_match_selector(:field, 'customer_email')
    find(:select, 'form_title').wont_match_selector(:field, 'customer_email')
  end

  it "supports match_css expectations" do
    find(:select, 'form_title').must_match_css('select#form_title')
    find(:select, 'form_title').wont_match_css('select#form_other_title')
  end

  it "supports match_xpath expectations" do
    find(:select, 'form_title').must_match_xpath('.//select[@id="form_title"]')
    find(:select, 'form_title').wont_match_xpath('.//select[@id="not_on_page"]')
  end

  it "handles failures" do
    page.must_have_select('non_existing_form_title')
  end
end

RSpec.describe 'capybara/minitest/spec' do
  before do
    Capybara.current_driver = :rack_test
    Capybara.app = TestApp
  end

  it "should support minitest spec" do
    output = StringIO.new
    reporter = Minitest::SummaryReporter.new(output)
    reporter.start
    MinitestSpecTest.run reporter, {}
    reporter.report
    expect(output.string).to include("18 runs, 41 assertions, 1 failures, 0 errors, 0 skips")
    #Make sure error messages are displayed
    expect(output.string).to include('expected to find visible select box "non_existing_form_title" that is not disabled but there were no matches')
  end
end
