Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ end
group :test do
gem "brakeman" # security inspection
gem "capybara"
gem "rspec-retry" # for retrying flaky tests
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://rubygems.org/gems/rspec-retry seems reasonable, last update 2019 but simple

gem "capybara-screenshot"
gem "database_cleaner-active_record"
gem "docx"
Expand Down
3 changes: 3 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,8 @@ GEM
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.2)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
Expand Down Expand Up @@ -695,6 +697,7 @@ DEPENDENCIES
request_store
rexml
rspec-rails
rspec-retry
rspec_junit_formatter
rswag-api
rswag-specs
Expand Down
4 changes: 2 additions & 2 deletions app/javascript/controllers/multiple_select_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ export default class extends Controller {
label: '<i class="lni lni-cross-circle"></i>'
},
checkbox_options: {
checkedClassNames: ['form-check-input'],
uncheckedClassNames: ['form-check-input']
checkedClassNames: ['form-check-input', 'form-check-input--checked'],
uncheckedClassNames: ['form-check-input', 'form-check-input--unchecked']
}
},
options: dropdownOptions,
Expand Down
46 changes: 23 additions & 23 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,30 @@
# the additional setup, and require it from the spec files that actually need
# it.

# if ENV["RUN_SIMPLECOV"]
# require "simplecov"
# SimpleCov.start do
# command_name "Job #{ENV["TEST_ENV_NUMBER"]}" if ENV["TEST_ENV_NUMBER"]
if ENV["RUN_SIMPLECOV"]
require "simplecov"
SimpleCov.start do
command_name "Job #{ENV["TEST_ENV_NUMBER"]}" if ENV["TEST_ENV_NUMBER"]

# add_filter "/spec/"
# add_filter "/lib/tasks/auto_annotate_models.rake"
# add_group "Models", "/app/models"
# add_group "Controllers", "/app/controllers"
# add_group "Channels", "/app/channels"
# add_group "Decorators", "/app/decorators"
# add_group "Helpers", "/app/helpers"
# add_group "Jobs", "/app/jobs"
# add_group "Importers", "/app/lib/importers"
# add_group "Mailers", "/app/mailers"
# add_group "Policies", "/app/policies"
# add_group "Values", "/app/values"
# add_group "Tasks", "/lib/tasks"
# add_group "Config", "/config"
# add_group "Database", "/db"
# end
# # https://github.com/simplecov-ruby/simplecov?tab=readme-ov-file#want-to-use-spring-with-simplecov
# # Rails.application.eager_load!
# end
add_filter "/spec/"
add_filter "/lib/tasks/auto_annotate_models.rake"
add_group "Models", "/app/models"
add_group "Controllers", "/app/controllers"
add_group "Channels", "/app/channels"
add_group "Decorators", "/app/decorators"
add_group "Helpers", "/app/helpers"
add_group "Jobs", "/app/jobs"
add_group "Importers", "/app/lib/importers"
add_group "Mailers", "/app/mailers"
add_group "Policies", "/app/policies"
add_group "Values", "/app/values"
add_group "Tasks", "/lib/tasks"
add_group "Config", "/config"
add_group "Database", "/db"
end
# https://github.com/simplecov-ruby/simplecov?tab=readme-ov-file#want-to-use-spring-with-simplecov
# Rails.application.eager_load!
end

# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
Expand Down
16 changes: 16 additions & 0 deletions spec/support/rspec_retry.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# spec/spec_helper.rb
require "rspec/retry"

RSpec.configure do |config|
# show retry status in spec process
config.verbose_retry = true
# show exception that triggers a retry if verbose_retry is set to true
config.display_try_failure_messages = true

if ENV["CI"] == "true"
# run retry only on features
config.around :each, :js do |ex|
ex.run_with_retry retry: 3
end
end
end
25 changes: 17 additions & 8 deletions spec/system/casa_cases/edit_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,21 @@

find(".ts-control").click

ts_checkboxes = page.all(".ts-dropdown-content input")
page.all(".ts-dropdown-content input")

select_all_el = page.find("span[data-test=select-all-input]")
# uncheck all contact type options
select_all_el.click
ts_checkboxes.each do |el|
expect(el).not_to be_checked
within ".ts-dropdown-content" do
expect(page).not_to have_css(".form-check-input--checked")
expect(page).to have_css(".form-check-input--unchecked", count: 3)
end
# check all contact type options
select_all_el.click
expect(ts_checkboxes).to all(be_checked)
within ".ts-dropdown-content" do
expect(page).not_to have_css("input.form-check-input--unchecked")
expect(page).to have_css("input.form-check-input--checked", count: 3)
end
Comment on lines +58 to +61
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an ugly fix but the issue with the initial code is that when you run checked? on the nodes rspec won't use any capybara waiting. It checks right at the moment and either passes or fails.

Thus, if the test runs that check before the javascript on the page runs the test will fail. When we use have_ selectors we can avoid this issue.

I would like to have done something more like `have_checked("id_of_input") but tomselect does not give us something like that. instead I added a css class for checked and unchecked inputs in tomselect and assert against that.


# unselect contact_type from dropdown
find("span", text: contact_type.name).click
Expand Down Expand Up @@ -238,17 +242,20 @@
expect(page).to have_text("Set Implementation Status")

find(".ts-control").click
ts_checkboxes = page.all(".ts-dropdown-content input")

select_all_el = page.find("span[data-test=select-all-input]")
# uncheck all contact type options
select_all_el.click
ts_checkboxes.each do |el|
expect(el).not_to be_checked
within ".ts-dropdown-content" do
expect(page).not_to have_css(".form-check-input--checked")
expect(page).to have_css(".form-check-input--unchecked", count: 2)
end
# check all contact type options
select_all_el.click
expect(ts_checkboxes).to all(be_checked)
within ".ts-dropdown-content" do
expect(page).not_to have_css("input.form-check-input--unchecked")
expect(page).to have_css("input.form-check-input--checked", count: 2)
end
# since all contact type options checked, don't need to select one
within ".top-page-actions" do
click_on "Update CASA Case"
Expand Down Expand Up @@ -317,6 +324,8 @@ def sign_in_and_assign_volunteer
context "when a volunteer is assigned to a case" do
it "marks the volunteer as assigned and shows the start date of the assignment", :js do
sign_in_and_assign_volunteer
expect(page).to have_content("Volunteer assigned to case")

expect(casa_case.case_assignments.count).to eq 1

unassign_button = page.find("button.btn-outline-danger")
Expand Down
11 changes: 7 additions & 4 deletions spec/system/casa_cases/new_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,19 @@

find(".ts-control").click

ts_checkboxes = page.all(".ts-dropdown-content input")
select_all_el = page.find("span[data-test=select-all-input]")
# uncheck all contact type options
select_all_el.click
ts_checkboxes.each do |el|
expect(el).not_to be_checked
within ".ts-dropdown-content" do
expect(page).not_to have_css(".form-check-input--checked")
expect(page).to have_css(".form-check-input--unchecked", count: 2)
end
# check all contact type options
select_all_el.click
expect(ts_checkboxes).to all(be_checked)
within ".ts-dropdown-content" do
expect(page).not_to have_css("input.form-check-input--unchecked")
expect(page).to have_css("input.form-check-input--checked", count: 2)
end

select "Test User", from: "casa_case[case_assignments_attributes][0][volunteer_id]"

Expand Down
17 changes: 11 additions & 6 deletions spec/system/case_contacts/contact_topic_answers_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ def notes_section
{question: topic_two.question, answer: "Second discussion topic answer."}
])

expect { click_on "Submit" }
.to change(CaseContact.active, :count).by(1)
click_on "Submit"
expect(page).to have_content("Case contact successfully created.")
expect(CaseContact.active.size).to eq 1

case_contact = CaseContact.active.last
expect(case_contact.reload.contact_topic_answers).to be_present
Expand All @@ -64,7 +65,7 @@ def notes_section
subject
fill_in_contact_details(contact_types: [contact_type.name])

expect {
expect do
using_wait_time 6 do # autosave debounce may be longer than capybara's wait time
answer_topic contact_topics.first.question, "First discussion topic answer."
within notes_section do
Expand All @@ -76,8 +77,8 @@ def notes_section
end

click_on "Submit"
}
.to change(CaseContact.active, :count).by(1)
expect(page).to have_content("Case contact successfully created.")
end.to change(CaseContact.active, :count).by(1)
.and change(ContactTopicAnswer, :count).by(0) # answer already exists on page load

case_contact = CaseContact.active.last
Expand Down Expand Up @@ -122,7 +123,10 @@ def notes_section
fill_in_contact_details
fill_in "Additional Notes", with: "This is a note."

expect { click_on "Submit" }.to change(CaseContact.active, :count).by(1)
expect do
click_on "Submit"
expect(page).to have_content("Case contact successfully created.")
end.to change(CaseContact.active, :count).by(1)

contact = CaseContact.active.last
expect(contact.contact_topic_answers).to be_empty
Expand Down Expand Up @@ -188,6 +192,7 @@ def notes_section
expect(notes_section).to have_select(class: topic_select_class, count: 1, visible: :all)

click_on "Submit"
expect(page).to have_content(/Case contact .* was successfully updated./)
}
.to change(ContactTopicAnswer, :count).by(-1)

Expand Down
18 changes: 13 additions & 5 deletions spec/system/case_contacts/followups/resolve_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@
let(:case_contact) { build(:case_contact, casa_case: casa_case, creator: cc_creator) }
let!(:followup) { create(:followup, case_contact: case_contact, creator: followup_creator) }

before { sign_in admin }

it "changes status of followup to resolved" do
sign_in admin
visit casa_case_path(case_contact.casa_case)

click_button "Resolve Reminder"
expect(page).to have_button("Make Reminder")

expect(case_contact.followups.count).to eq(1)
expect(case_contact.followups.first.resolved?).to be_truthy
Expand All @@ -25,11 +27,13 @@
let(:cc_creator) { volunteer }
let(:followup_creator) { volunteer }

xit "changes status of followup to resolved" do # TODO make test not flaky
sign_in admin
before { sign_in admin }

it "changes status of followup to resolved" do # TODO make test not flaky
visit casa_case_path(case_contact.casa_case)

click_button "Resolve Reminder"
expect(page).to have_button("Make Reminder")

expect(case_contact.followups.count).to eq(1)
expect(case_contact.followups.first.resolved?).to be_truthy
Expand All @@ -40,6 +44,7 @@
visit casa_case_path(case_contact.casa_case)

click_button "Resolve Reminder"
expect(page).to have_button("Make Reminder")

expect(page).to have_button("Make Reminder")
end
Expand All @@ -49,11 +54,13 @@
let(:cc_creator) { supervisor }
let(:followup_creator) { volunteer }

before { sign_in supervisor }

it "changes status of followup to resolved" do
sign_in supervisor
visit casa_case_path(case_contact.casa_case)

click_button "Resolve Reminder"
expect(page).to have_button("Make Reminder")

expect(case_contact.followups.count).to eq(1)
expect(case_contact.followups.first.resolved?).to be_truthy
Expand All @@ -66,13 +73,14 @@

before do
case_contact.casa_case.assigned_volunteers << volunteer
sign_in volunteer
end

it "changes status of followup to resolved" do
sign_in volunteer
visit case_contacts_path

click_button "Resolve Reminder"
expect(page).to have_button("Make Reminder")

expect(case_contact.followups.count).to eq(1)
expect(case_contact.followups.first.resolved?).to be_truthy
Expand Down
Loading