Search code examples
ruby-on-railsrspeccapybaracapybara-webkit

Records of a table are deleted when there is no `expect.. to .. have_content..`


I have a simple spec like this :

scenario "Fill the payments information for a painting", js: true do
  period = create(:period)
  painting = create(:painting, period: period, published: false)
  admin = AdminUser.create!(email: 'admin@example.com', password: 'test1234')
  painting_price = create(:painting_price)

  sign_in
  visit new_painting_order_path(painting_id: painting.id, painting_price_id: painting_price.id)
  click_on "MasterCard/Visa"
  puts Painting.unscoped
  click_on "Compléter la commande"
  expect(admin.email).to have_received_an_email
end

And a controller like this :

def create
  puts Painting.unscoped
  # ...
end

At the first puts, I have a painting, but at the second, there is no paitings. I activated the SQL traces and I have this :

  Painting Load (0.5ms)  SELECT "paintings".* FROM "paintings" |  ETA: ??:??:?? 
[#<Painting id: 1, artist_id: 1, title: "A title for the painting", year: "1997", technic: "A technic", dimensions: "20\" X 10\"", created_at: "2014-08-10 11:08:01", updated_at: "2014-08-10 11:08:01", owner_id: 1, painting_technic_id: 1, painting_type_id: 1, measure_unit_
id: 1, painting_category_id: 2, height: 100, width: 100, depth: 10, height_with_frame: nil, width_with_frame: nil, depth_with_frame: nil, ref_catalog: nil, authenticity_certificate: nil, signature: nil, comment: nil, period_id: 1, published: false, address: "43 rue de la 
boustifaille", postal_code: "G0G 2B0", city: "Sept-Iles", phone: "0123456789", country_id: 3, region_id: nil, end_publishing_date: nil, on_demand: true, numbered: nil, framed: nil, painting_price_id: nil, source: nil, number: nil>]
   (0.9ms)  ALTER TABLE "active_admin_comments" DISABLE TRIGGER ALL;ALTER TABLE "provider_services" DISABLE TRIGGER ALL;ALTER TABLE "painting_category_translations" DISABLE TRIGGER ALL;ALTER TABLE "page_translations" DISABLE TRIGGER ALL;ALTER TABLE "painting_provenances" 
DISABLE TRIGGER ALL;ALTER TABLE "painting_technics" DISABLE TRIGGER ALL;ALTER TABLE "painting_type_translations" DISABLE TRIGGER ALL;ALTER TABLE "region_translations" DISABLE TRIGGER ALL;ALTER TABLE "orders" DISABLE TRIGGER ALL;ALTER TABLE "pages" DISABLE TRIGGER ALL;ALTER TABLE "painting_technic_translations" DISABLE TRIGGER ALL;ALTER TABLE "painting_prices" DISABLE TRIGGER ALL;ALTER TABLE "provider_divisions" DISABLE TRIGGER ALL;ALTER TABLE "provider_profile_translations" DISABLE TRIGGER ALL;ALTER TABLE "additional_information_option_t$anslations" DISABLE TRIGGER ALL;ALTER TABLE "additional_information_type_services" DISABLE TRIGGER ALL;ALTER TABLE "additional_information_type_translations" DISABLE TRIGGER ALL;ALTER TABLE "painting_types" DISABLE TRIGGER ALL;ALTER TABLE "period_translations" DISABLE TR$GGER ALL;ALTER TABLE "simple_captcha_data" DISABLE TRIGGER ALL;ALTER TABLE "temp_provider_profiles" DISABLE TRIGGER ALL;ALTER TABLE "paintings" DISABLE TRIGGER ALL;ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_intervention_level_provid$
ds" DISABLE TRIGGER ALL;ALTER TABLE "painting_categories" DISABLE TRIGGER ALL;ALTER TABLE "images" DISABLE TRIGGER ALL;ALTER TABLE "page_part_translations" DISABLE TRIGGER ALL;ALTER TABLE "intervention_levels_provided" DISABLE TRIGGER ALL;ALTER TABLE "regions" DISABLE TR$
GGER ALL;ALTER TABLE "services_provided" DISABLE TRIGGER ALL;ALTER TABLE "service_translations" DISABLE TRIGGER ALL;ALTER TABLE "services" DISABLE TRIGGER ALL;ALTER TABLE "service_formulas" DISABLE TRIGGER ALL;ALTER TABLE "messages" DISABLE TRIGGER ALL;ALTER TABLE "provi$
er_service_additional_information_options" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_medium_provideds" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_service_provideds" DISABLE TRIGGER ALL;ALTER TABLE "provider_service_territory_provideds" DISABLE TRIGGER ALL;$
LTER TABLE "provider_profiles" DISABLE TRIGGER ALL;ALTER TABLE "additional_information_options" DISABLE TRIGGER ALL;ALTER TABLE "admin_users" DISABLE TRIGGER ALL;ALTER TABLE "city_translations" DISABLE TRIGGER ALL;ALTER TABLE "periods" DISABLE TRIGGER ALL;ALTER TABLE "te$
ritories_provided" DISABLE TRIGGER ALL;ALTER TABLE "temp_provider_services" DISABLE TRIGGER ALL;ALTER TABLE "collector_profiles" DISABLE TRIGGER ALL;ALTER TABLE "notifications" DISABLE TRIGGER ALL;ALTER TABLE "page_parts" DISABLE TRIGGER ALL;ALTER TABLE "page_services" D$SABLE TRIGGER ALL;ALTER TABLE "measure_unit_translations" DISABLE TRIGGER ALL;ALTER TABLE "formulas" DISABLE TRIGGER ALL;ALTER TABLE "measure_units" DISABLE TRIGGER ALL;ALTER TABLE "media_provided" DISABLE TRIGGER ALL;ALTER TABLE "coupon_periods" DISABLE TRIGGER ALL;ALTE$ TABLE "coupons" DISABLE TRIGGER ALL;ALTER TABLE "currencies" DISABLE TRIGGER ALL;ALTER TABLE "artists" DISABLE TRIGGER ALL;ALTER TABLE "cities" DISABLE TRIGGER ALL;ALTER TABLE "countries" DISABLE TRIGGER ALL;ALTER TABLE "country_translations" DISABLE TRIGGER ALL;ALTER T$BLE "users" DISABLE TRIGGER ALL;ALTER TABLE "additional_information_types" DISABLE TRIGGER ALL
  User Load (1234.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
  Painting Load (0.7ms)  SELECT "paintings".* FROM "paintings" 
[]
  Painting Load (0.4ms)  SELECT "paintings".* FROM "paintings" WHERE "paintings"."id" = $1 LIMIT 1  [["id", "1"]]
   (1293.0ms)  TRUNCATE TABLE "active_admin_comments", "provider_services", "painting_provenances", "painting_technics", "painting_type_translations", "painting_category_translations", "page_translations", "orders", "pages", "painting_technic_translations", "region_trans$ations", "provider_profile_translations", "additional_information_option_translations", "painting_prices", "provider_divisions", "additional_information_type_services", "additional_information_type_translations", "painting_types", "period_translations", "paintings", "sim$le_captcha_data", "temp_provider_profiles", "provider_service_intervention_level_provideds", "painting_categories", "images", "page_part_translations", "intervention_levels_provided", "regions", "services_provided", "services", "service_formulas", "service_translations", "messages", "provider_service_additional_information_options", "provider_service_medium_provideds", "provider_service_service_provideds", "provider_service_territory_provideds", "provider_profiles", "city_translations", "periods", "additional_information_options", "admin$users", "territories_provided", "temp_provider_services", "collector_profiles", "notifications", "page_parts", "page_services", "measure_unit_translations", "formulas", "measure_units", "media_provided", "coupon_periods", "coupons", "currencies", "cities", "countries", "$ountry_translations", "users", "additional_information_types", "artists" RESTART IDENTITY CASCADE;
   (1.6ms)  ALTER TABLE "active_admin_comments" ENABLE TRIGGER ALL;ALTER TABLE "provider_services" ENABLE TRIGGER ALL;ALTER TABLE "painting_category_translations" ENABLE TRIGGER ALL;ALTER TABLE "page_translations" ENABLE TRIGGER ALL;ALTER TABLE "painting_provenances" ENA$LE TRIGGER ALL;ALTER TABLE "painting_technics" ENABLE TRIGGER ALL;ALTER TABLE "painting_type_translations" ENABLE TRIGGER ALL;ALTER TABLE "region_translations" ENABLE TRIGGER ALL;ALTER TABLE "orders" ENABLE TRIGGER ALL;ALTER TABLE "pages" ENABLE TRIGGER ALL;ALTER TABLE "$ainting_technic_translations" ENABLE TRIGGER ALL;ALTER TABLE "painting_prices" ENABLE TRIGGER ALL;ALTER TABLE "provider_divisions" ENABLE TRIGGER ALL;ALTER TABLE "provider_profile_translations" ENABLE TRIGGER ALL;ALTER TABLE "additional_information_option_translations" E$ABLE TRIGGER ALL;ALTER TABLE "additional_information_type_services" ENABLE TRIGGER ALL;ALTER TABLE "additional_information_type_translations" ENABLE TRIGGER ALL;ALTER TABLE "painting_types" ENABLE TRIGGER ALL;ALTER TABLE "period_translations" ENABLE TRIGGER ALL;ALTER TAB$E "simple_captcha_data" ENABLE TRIGGER ALL;ALTER TABLE "temp_provider_profiles" ENABLE TRIGGER ALL;ALTER TABLE "paintings" ENABLE TRIGGER ALL;ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "provider_service_intervention_level_provideds" ENABLE TRIGGER ALL$
ALTER TABLE "painting_categories" ENABLE TRIGGER ALL;ALTER TABLE "images" ENABLE TRIGGER ALL;ALTER TABLE "page_part_translations" ENABLE TRIGGER ALL;ALTER TABLE "intervention_levels_provided" ENABLE TRIGGER ALL;ALTER TABLE "regions" ENABLE TRIGGER ALL;ALTER TABLE "servic$
s_provided" ENABLE TRIGGER ALL;ALTER TABLE "service_translations" ENABLE TRIGGER ALL;ALTER TABLE "services" ENABLE TRIGGER ALL;ALTER TABLE "service_formulas" ENABLE TRIGGER ALL;ALTER TABLE "messages" ENABLE TRIGGER ALL;ALTER TABLE "provider_service_additional_information$
options" ENABLE TRIGGER ALL;ALTER TABLE "provider_service_medium_provideds" ENABLE TRIGGER ALL;ALTER TABLE "provider_service_service_provideds" ENABLE TRIGGER ALL;ALTER TABLE "provider_service_territory_provideds" ENABLE TRIGGER ALL;ALTER TABLE "provider_profiles" ENABLE 
TRIGGER ALL;ALTER TABLE "additional_information_options" ENABLE TRIGGER ALL;ALTER TABLE "admin_users" ENABLE TRIGGER ALL;ALTER TABLE "city_translations" ENABLE TRIGGER ALL;ALTER TABLE "periods" ENABLE TRIGGER ALL;ALTER TABLE "territories_provided" ENABLE TRIGGER ALL;ALTE$
 TABLE "temp_provider_services" ENABLE TRIGGER ALL;ALTER TABLE "collector_profiles" ENABLE TRIGGER ALL;ALTER TABLE "notifications" ENABLE TRIGGER ALL;ALTER TABLE "page_parts" ENABLE TRIGGER ALL;ALTER TABLE "page_services" ENABLE TRIGGER ALL;ALTER TABLE "measure_unit_tran$
lations" ENABLE TRIGGER ALL;ALTER TABLE "formulas" ENABLE TRIGGER ALL;ALTER TABLE "measure_units" ENABLE TRIGGER ALL;ALTER TABLE "media_provided" ENABLE TRIGGER ALL;ALTER TABLE "coupon_periods" ENABLE TRIGGER ALL;ALTER TABLE "coupons" ENABLE TRIGGER ALL;ALTER TABLE "curr$
ncies" ENABLE TRIGGER ALL;ALTER TABLE "artists" ENABLE TRIGGER ALL;ALTER TABLE "cities" ENABLE TRIGGER ALL;ALTER TABLE "countries" ENABLE TRIGGER ALL;ALTER TABLE "country_translations" ENABLE TRIGGER ALL;ALTER TABLE "users" ENABLE TRIGGER ALL;ALTER TABLE "additional_info$
mation_types" ENABLE TRIGGER ALL

At you can see, between the two puts it do a DISABLE TRIGGER ALL. Obviously, I have nothing in my code to do that.

When I add expect(page).to have_content("Votre commande a bien été éffectuée") after the Compléter la commande. It works.

I think there is a problem with capybara-webkit. It seems to clean database before the time.

Do you have an idea to fix it?


Solution

  • Unless you are using the rack-test driver capybara calls are in general asynchronous - it has no idea when the processing that results from the click has finished. As soon as execution of the code inside your spec block completes it will use database cleaner to clean your tables.

    Normally you don't notice this since the capybara finder methods (that are used by things like have_css, have_content,click_link etc) will retry for a limited period of time. Your check on the email deliveries doesn't know how to do this.

    This simplest fix is what you have already found: use one of the capybara methods that does know how to wait to introduce a synchronisation point.