Module: ApiMaker::SpecHelper

Defined in:
lib/api_maker/spec_helper.rb

Instance Method Summary collapse

Instance Method Details

#chrome_logsObject



2
3
4
# File 'lib/api_maker/spec_helper.rb', line 2

def chrome_logs
  page.driver.browser.manage.logs.get(:browser)
end

#expect_no_chrome_errorsObject



24
25
26
27
28
29
30
31
32
33
# File 'lib/api_maker/spec_helper.rb', line 24

def expect_no_chrome_errors
  logs = chrome_logs.map(&:to_s)
  logs = logs.reject { |log| log.include?("Warning: Can't perform a React state update on an unmounted component.") }
  return if !logs || !logs.join("\n").include?("SEVERE ")

  expect_no_chrome_window_errors

  puts logs.join("\n")
  expect(logs).to eq nil
end

#expect_no_chrome_window_errorsObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/api_maker/spec_helper.rb', line 6

def expect_no_chrome_window_errors
  sleep 1

  errors = execute_script("if (window.errorLogger) { return window.errorLogger.getErrors() }")
  return if !errors.is_a?(Array) || errors.empty?

  last_error = errors.last

  custom_trace = []
  custom_trace += last_error.fetch("backtrace") if last_error["backtrace"].is_a?(Array)
  custom_trace += caller

  error = RuntimeError.new("#{last_error["errorClass"]}: #{last_error["message"]}")
  error.set_backtrace(custom_trace)

  raise error
end

#expect_no_errorsObject



35
36
37
38
# File 'lib/api_maker/spec_helper.rb', line 35

def expect_no_errors
  expect_no_flash_errors
  expect_no_chrome_errors
end

#js_fill_in(element_id, with:) ⇒ Object



40
41
42
# File 'lib/api_maker/spec_helper.rb', line 40

def js_fill_in(element_id, with:)
  page.execute_script("document.querySelector(#{element_id.to_json}).value = #{with.to_json}")
end

#pretty_htmlObject



44
45
46
47
# File 'lib/api_maker/spec_helper.rb', line 44

def pretty_html
  require "htmlbeautifier"
  HtmlBeautifier.beautify(page.html)
end

#reset_indexeddbObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/api_maker/spec_helper.rb', line 49

def reset_indexeddb
  execute_script "
    indexedDB.databases().then(function(databases) {
      var promises = []
      for(var database of databases) {
        promises.push(indexedDB.deleteDatabase(database.name))
      }

      Promise.all(promises).then(function() {
        console.error('All databases was deleted')
      })
    })
  "

  wait_for_condition do
    logs_text = chrome_logs.map(&:message).join("\n")
    logs_text.include?("\"All databases was deleted\"")
  end
end

#wait_for_chrome(delay_sec: 0.5, timeout_sec: 6) ⇒ Object



69
70
71
72
73
74
# File 'lib/api_maker/spec_helper.rb', line 69

def wait_for_chrome(delay_sec: 0.5, timeout_sec: 6)
  WaitUtil.wait_for_condition("wait for chrome", timeout_sec: timeout_sec, delay_sec: delay_sec) do
    expect_no_chrome_errors
    yield
  end
end

#wait_for_flash_message(expected_message, delay_sec: 0.5, timeout_sec: 10) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/api_maker/spec_helper.rb', line 76

def wait_for_flash_message(expected_message, delay_sec: 0.5, timeout_sec: 10)
  received_messages = []

  begin
    WaitUtil.wait_for_condition("wait for flash message", timeout_sec: timeout_sec, delay_sec: delay_sec) do
      expect_no_chrome_errors
      current_message = flash_message_text
      received_messages << current_message
      current_message == expected_message
    end
  rescue WaitUtil::TimeoutError
    expect(received_messages.uniq.reject(&:blank?)).to eq include expected_message
  end
end

#wait_for_selector(selector) ⇒ Object



91
92
93
# File 'lib/api_maker/spec_helper.rb', line 91

def wait_for_selector(selector)
  wait_for_chrome { page.has_selector?(selector) }
end

#wait_for_selectors(*selectors) ⇒ Object



95
96
97
98
99
# File 'lib/api_maker/spec_helper.rb', line 95

def wait_for_selectors(*selectors)
  selectors.each do |selector|
    wait_for_selector(selector)
  end
end