# encoding: utf-8 module ProxyTester module SpecHelper module Capybara include ::Capybara::DSL @__runtime = Time.now.strftime('%Y-%m-%d_%H:%M:%S') class << self def runtime @__runtime end end def proxy @__proxy end def proxy_pac @__proxy_pac end def keep_report_directories @__keep_report_directories ||= 5 end def cleanup_reports old_report_directories.each { |d| FileUtils.rm_rf d } end def take_screenshot page.save_screenshot(screenshot_path, full: true) screenshot_path end def view_screenshot show_image(take_screenshot) end alias_method :show_screenshot, :view_screenshot def use_user_agent(agent) page.driver.headers = { "User-Agent" => agent } end def visit(url) @__proxy ||= ProxyTester::CapybaraProxy.new @__proxy_pac ||= ProxyTester::CapybaraProxyPac.new proxy_pac.url = url if !proxy_pac.blank? and !proxy_pac.direct? proxy.host = proxy_pac.host proxy.port = proxy_pac.port end register_driver proxy use_driver proxy use_user_agent 'Mozilla/5.0 (X11; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0' begin super(url) rescue ::Capybara::Poltergeist::TimeoutError raise ProxyTester::Exceptions::FetchUrlTimeout end end def use_user(name) @__proxy ||= ProxyTester::CapybaraProxy.new proxy.user = ProxyTester::User.find_by!(name: name) rescue ActiveRecord::RecordNotFound ProxyTester.ui_logger.fatal "User \"#{name}\" could not be found. Please make use he's in the user database. Exiting." raise ProxyTester::Exceptions::ProxyUserInvalid, user: name end def use_client_ip(ip) @__proxy_pac ||= ProxyTester::CapybaraProxyPac.new proxy_pac.client_ip = ip end def use_time(time) @__proxy_pac ||= ProxyTester::CapybaraProxyPac.new proxy_pac.time = time end def use_proxy(*args) @__proxy ||= ProxyTester::CapybaraProxy.new @__proxy_pac ||= ProxyTester::CapybaraProxyPac.new if args.first.kind_of? Symbol case args.first when :host proxy.host, proxy.port = args.second.split(/:/) when :pac proxy_pac.pac_file = args.second else fail ProxyTester::Exceptions::SyntaxInvalid, message: "Unknown symbol: #{args.first}" end else proxy.host, proxy.port = args.first.split(/:/) end proxy.type = args.last[:type] if args.last.kind_of? Hash end def use_timeout(threshold, &block) old_timeout = ::Capybara.default_wait_time ::Capybara.default_wait_time = threshold block.call ensure ::Capybara.default_wait_time = old_timeout end private def use_driver(proxy) ::Capybara.current_driver = proxy.to_sym end def register_driver(local_proxy) if local_proxy.blank? options = { js_errors: false, phantomjs_logger: $stderr, } else options = { phantomjs_options: local_proxy.as_phantomjs_arguments, js_errors: false, phantomjs_logger: $stderr, } end ProxyTester.ui_logger.debug('options: ' + options.to_s) ::Capybara.register_driver local_proxy.to_sym do |app| ::Capybara::Poltergeist::Driver.new(app, options) end ::Capybara.run_server = false end def screenshot_directory if @__screenshot_dir.blank? @__screenshot_dir = File.join(ProxyTester.config.reports_directory, ProxyTester::SpecHelper::Capybara.runtime) FileUtils.mkdir_p @__screenshot_dir end @__screenshot_dir end def screenshot_path return @__screenshot_path if @__screenshot_path @__screenshot_path = File.join(screenshot_directory, "#{example.full_description.parameterize}.png") end def old_report_directories Dir.glob(File.join(ProxyTester.config.reports_directory, '*')).keep_if { |d| FileTest.directory? d }.sort.reverse.drop(keep_report_directories) end def operating_system case RUBY_PLATFORM.downcase when /win32/ :win32 when /linux/ :linux when /darwin/ :darwin else :unknown end end def show_image(image) viewer = case operating_system when :linux 'xdg-open' when :win32 'start' when :darwin 'open' else 'xdg-open' end system("#{viewer} #{image.shellescape}") end end end end RSpec.configure do |c| c.include ProxyTester::SpecHelper::Capybara c.before :each do @__proxy = ProxyTester::CapybaraProxy.new end c.before :all do cleanup_reports end end Capybara.default_driver = :poltergeist