Skip to content

Commit

Permalink
Made TestHelpers include methods from WaitForLoaded
Browse files Browse the repository at this point in the history
Right now many of the test helpers don't work in any other project because they rely on methods from WaitForLoaded and the test helpers crash when they are called. This isn't an issue in the avo project itself because the WaitForLoaded methods are required automatically by the avo test suite. It isn't possible to load WaitForLoaded in projects using the rubygem of avo because files inside the spec directory aren't included (and even if they were it would be a bit weird to load something from `spec/support` in a gem).

To fix this I've moved WaitForLoaded alongside the TestHelpers module and included it from there so the helper methods can be used in other projects.
  • Loading branch information
iainbeeston committed Oct 10, 2024
1 parent 5a60b49 commit 79ea9fb
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 105 deletions.
2 changes: 2 additions & 0 deletions lib/avo/test_helpers.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module Avo
module TestHelpers
include WaitForLoaded

# Finds the wrapper element on the index view for the given field id and type, and associated with the given record id
# Example usage:
# index_field_wrapper(id: "name", type: "text", record_id: 2)
Expand Down
108 changes: 108 additions & 0 deletions lib/avo/wait_for_loaded.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
require "timeout"

module Avo
module WaitForLoaded
def wait_for_route_loading(time = Capybara.default_max_wait_time)
Timeout.timeout(time) { sleep(0.01) until page.find("body")[:class].include?("route-loading") }
end

def wait_for_route_loaded(time = Capybara.default_max_wait_time)
Timeout.timeout(time) { sleep(0.01) while page.find("body")[:class].include?("route-loading") }
end

def wait_for_turbo_loaded(time = Capybara.default_max_wait_time)
wait_for_body_class_missing("turbo-loading", time)
end

def wait_for_search_loaded(time = Capybara.default_max_wait_time)
wait_for_body_class_missing("search-loading", time)
end

def wait_for_search_to_dissapear(time = Capybara.default_max_wait_time)
wait_for_element_missing(".aa-DetachedOverlay", time)
end

def wait_for_turbo_frame_id(frame_id = "", time = Capybara.default_max_wait_time)
wait_for_element_missing("turbo-frame[id='#{frame_id}'][busy]", time)
end

def wait_for_turbo_frame_src(frame_src = "", time = Capybara.default_max_wait_time)
wait_for_element_missing("turbo-frame[src='#{frame_src}'][busy]", time)
end

def wait_for_body_class_missing(klass = "turbo-loading", time = Capybara.default_max_wait_time)
Timeout.timeout(time) do
body = page.find(:xpath, "//body")
break if !body[:class].to_s.include?(klass)

if page.present? && body.present? && body[:class].present? && body[:class].is_a?(String)
sleep(0.1) until page.present? && !body[:class].to_s.include?(klass)
else
sleep 0.1
end
end
rescue Timeout::Error
puts "\n\nMethod '#{__method__}' raised 'Timeout::Error' after #{time}s"
end

def wait_for_element_missing(identifier = ".element", time = Capybara.default_max_wait_time)
Timeout.timeout(time) do
if page.present?
break if page.has_no_css?(identifier, wait: time)
else
sleep 0.05
end
end
end

def wait_for_element_present(identifier = ".element", time = Capybara.default_max_wait_time)
Timeout.timeout(time) do
if page.present?
break if page.has_css?(identifier, wait: time)
else
sleep 0.05
end
end
end

def wait_for_loaded
wait_for_turbo_loaded
end

def wait_for_action_dialog_to_disappear(time = Capybara.default_max_wait_time)
wait_for_element_missing("[role='dialog']", time)
end

def wait_for_tag_to_disappear(tag, time = Capybara.default_max_wait_time)
Capybara.using_wait_time(time) do
page.has_no_css?(".tagify__tag", text: tag)
end
end

def wait_for_tag_to_appear(tag, time = Capybara.default_max_wait_time)
Capybara.using_wait_time(time) do
page.has_css?(".tagify__tag", text: tag)
end
end

def wait_for_tag_suggestions_to_appear(time = Capybara.default_max_wait_time)
Capybara.using_wait_time(time) do
page.has_css?(".tagify__dropdown")
end

current_count = prev_count = page.all('.tagify__dropdown__item').count

Check failure on line 93 in lib/avo/wait_for_loaded.rb

View workflow job for this annotation

GitHub Actions / lint / runner / standardrb

[rubocop] reported by reviewdog 🐶 [Corrected] Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping. Raw Output: lib/avo/wait_for_loaded.rb:93:45: C: [Corrected] Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping. current_count = prev_count = page.all('.tagify__dropdown__item').count ^^^^^^^^^^^^^^^^^^^^^^^^^
attempts = 5

loop do
sleep(0.05)
current_count = page.all('.tagify__dropdown__item').count

Check failure on line 98 in lib/avo/wait_for_loaded.rb

View workflow job for this annotation

GitHub Actions / lint / runner / standardrb

[rubocop] reported by reviewdog 🐶 [Corrected] Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping. Raw Output: lib/avo/wait_for_loaded.rb:98:34: C: [Corrected] Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping. current_count = page.all('.tagify__dropdown__item').count ^^^^^^^^^^^^^^^^^^^^^^^^^

# Break when suggestions stop appearing
# Or attempts reach 0
attempts -= 1
break if (current_count == prev_count) || (attempts == 0)
prev_count = current_count
end
end
end
end
1 change: 0 additions & 1 deletion spec/rails_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,6 @@ def headless_download_setup(driver)
require "support/helpers"
require "support/factory_bot"
require "support/database_cleaner"
require "support/wait_for_loaded"
require "support/js_error_detector"
require "support/devise"
require "support/shared_contexts"
Expand Down
104 changes: 0 additions & 104 deletions spec/support/wait_for_loaded.rb

This file was deleted.

0 comments on commit 79ea9fb

Please sign in to comment.