11# rubocop: disable Style/GlobalVars
22
33if ENV [ "APPRAISAL_INITIALIZED" ]
4- RSpec . describe "before_ & after_commit hooks" , type : :controller do
4+ RSpec . describe "after_graph_persist, before_ & after_commit hooks" , type : :controller do
55 class Callbacks
66 class << self
77 attr_accessor :fired , :in_transaction_during , :entities
@@ -27,6 +27,7 @@ def in_transaction?
2727 Callbacks . fired = { }
2828 Callbacks . in_transaction_during = { }
2929 Callbacks . entities = [ ]
30+ $raise_on_after_graph_persist = { employee : false }
3031 $raise_on_before_commit = { employee : true }
3132 end
3233
@@ -63,7 +64,7 @@ class PositionResource < ApplicationResource
6364 before_commit do |position |
6465 Callbacks . add ( :before_position , position )
6566 if $raise_on_before_commit[ :position ]
66- raise "rollitback_book "
67+ raise "rollitback_position "
6768 end
6869 end
6970
@@ -75,6 +76,13 @@ class EmployeeResource < ApplicationResource
7576
7677 attribute :first_name , :string
7778
79+ after_graph_persist do |employee |
80+ Callbacks . add ( :after_graph_persist , employee )
81+ if $raise_on_after_graph_persist[ :employee ]
82+ raise "rollitback"
83+ end
84+ end
85+
7886 before_commit only : [ :create ] do |employee |
7987 Callbacks . add ( :before_create , employee )
8088 if $raise_on_before_commit[ :employee ]
@@ -191,7 +199,7 @@ def json
191199 post :create , params : payload
192200 } . to raise_error ( "rollitback" )
193201 expect ( Employee . count ) . to be_zero
194- expect ( Callbacks . entities . length ) . to eq ( 1 )
202+ expect ( Callbacks . entities . length ) . to eq ( 2 )
195203 expect ( Callbacks . fired [ :before_create ] ) . to be_a ( Employee )
196204 end
197205
@@ -218,7 +226,7 @@ def json
218226 expect {
219227 post :create , params : payload
220228 } . to raise_error ( "whoops" )
221- expect ( Callbacks . entities ) . to be_empty
229+ expect ( Callbacks . entities ) . to include ( :after_graph_persist )
222230 end
223231 end
224232
@@ -230,13 +238,31 @@ def json
230238 it "fires all before and after_commit hooks" do
231239 post :create , params : payload
232240 expect ( Callbacks . entities ) . to eq ( [
241+ :after_graph_persist ,
233242 :before_create ,
234243 :stacked_before_create ,
235244 :employee_after_create ,
236245 :employee_after_create_eval_test ,
237246 ] )
238247 end
239248 end
249+
250+ context "when an error is raised after_graph_persist" do
251+ before do
252+ $raise_on_after_graph_persist = { employee : true }
253+ end
254+
255+ it "does not run before_commit callbacks" do
256+ expect_any_instance_of ( Graphiti ::Util ::ValidationResponse )
257+ . to_not receive ( :validate! )
258+ expect {
259+ post :create , params : payload
260+ } . to raise_error ( "rollitback" )
261+ expect ( Employee . count ) . to be_zero
262+ expect ( Callbacks . entities . length ) . to eq ( 1 )
263+ expect ( Callbacks . fired [ :after_graph_persist ] ) . to be_a ( Employee )
264+ end
265+ end
240266 end
241267
242268 context "nested" do
@@ -281,6 +307,7 @@ def json
281307 post :create , params : payload
282308
283309 expect ( Callbacks . entities ) . to eq ( [
310+ :after_graph_persist ,
284311 :before_create ,
285312 :stacked_before_create ,
286313 :before_position ,
@@ -309,6 +336,12 @@ def json
309336 expect ( Callbacks . in_transaction_during [ :employee_after_create ] ) . to eq false
310337 expect ( Callbacks . fired [ :employee_after_create_eval_test ] ) . to be_a ( IntegrationHooks ::EmployeeResource )
311338 end
339+
340+ it "can access children resources from after_graph_persist" do
341+ post :create , params : payload
342+ expect ( Callbacks . fired [ :employee_after_create ] . positions . length ) . to eq ( 1 )
343+ expect ( Callbacks . fired [ :employee_after_create ] . positions [ 0 ] ) . to be_a ( Position )
344+ end
312345 end
313346
314347 context "when yielding meta" do
0 commit comments