Hello all,

I'm struggling to understand why an `after_create_commit` is executed in an 
example although `use_transactional_fixtures` is set to `true`.

I created a new Rails app to isolate/test this behavior:

ruby 3.1.2
rails 7.0.4.3
rspec-rails 6.0.1

$ rails g scaffold article title content:text
$ rails g scaffold comment article:references content:text

Here are the models:

class Article < ApplicationRecord
  has_many :comments, dependent: :destroy

  after_create_commit -> { comments.create!(content: "First comment of 
#{title}") }
end

class Comment < ApplicationRecord
  belongs_to :article
end

Then I wrote the following test:

require 'rails_helper'

RSpec.describe Article, type: :model do
  describe "create" do
    subject { described_class.create!(title: "Hello", content: "world") }

    it 'does not create a first comment' do
      ActiveRecord::Base.logger = Logger.new(STDOUT)
      expect { subject }.not_to change(Comment, :count).by(1)
    end
  end
end

I expect it NOT to create a comment because, from my understanding:
- The example is run within a transaction
- The after_create_commit is supposed to be run only after the transaction 
is committed
- RSpec is supposed to rollback the transaction (once the example is over) 
instead of committing it
- No commit, no after_create_commit. No after_create_commit, not comment 
created.

To my surprise, the comment _is_ created. Here is the SQL log for the above 
example:

```sql
D, [2023-04-26T15:51:25.707540 #346392] DEBUG -- :   Comment Count (0.0ms) 
 SELECT COUNT(*) FROM "comments"
D, [2023-04-26T15:51:25.709992 #346392] DEBUG -- :   TRANSACTION (0.0ms) 
 SAVEPOINT active_record_1
D, [2023-04-26T15:51:25.710339 #346392] DEBUG -- :   Article Create (0.1ms) 
 INSERT INTO "articles" ("title", "content", "created_at", "updated_at") 
VALUES (?, ?, ?, ?)  [["title", "Hello"], ["content", "world"], 
["created_at", "2023-04-26 13:51:25.709772"], ["updated_at", "2023-04-26 
13:51:25.709772"]]
D, [2023-04-26T15:51:25.710480 #346392] DEBUG -- :   TRANSACTION (0.0ms) 
 RELEASE SAVEPOINT active_record_1
D, [2023-04-26T15:51:25.713710 #346392] DEBUG -- :   TRANSACTION (0.0ms) 
 SAVEPOINT active_record_1
D, [2023-04-26T15:51:25.713915 #346392] DEBUG -- :   Comment Create (0.0ms) 
 INSERT INTO "comments" ("article_id", "content", "created_at", 
"updated_at") VALUES (?, ?, ?, ?)  [["article_id", 1], ["content", "First 
comment of Hello"], ["created_at", "2023-04-26 13:51:25.713563"], 
["updated_at", "2023-04-26 13:51:25.713563"]]
D, [2023-04-26T15:51:25.714024 #346392] DEBUG -- :   TRANSACTION (0.0ms) 
 RELEASE SAVEPOINT active_record_1
D, [2023-04-26T15:51:25.714173 #346392] DEBUG -- :   Comment Count (0.0ms) 
 SELECT COUNT(*) FROM "comments"
D, [2023-04-26T15:51:25.725359 #346392] DEBUG -- :   TRANSACTION (0.1ms) 
 rollback transaction
```

It seems that the after_create_commit block is run after the savepoint, 
which does not have the same meaning in my mind as after a commit. A 
savepoint can still be rolled back so I'm not yet sure the data is 
effectively persisted in the database while a commit cannot be rolled back 
and the data _is_ persisted.

Am I missing something here? Any explanation/help will be much appreciated!

Thanks

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rspec+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/8ae6893e-92e6-471c-8243-3f519efc7dd2n%40googlegroups.com.

Reply via email to