From 5a4e1708420739d3fcaec939336990c026ee8bf5 Mon Sep 17 00:00:00 2001 From: Sam Gong Date: Mon, 8 Sep 2025 11:30:02 -0400 Subject: [PATCH 1/6] MEM-7622: Stop-salesforce-syncable-objects-from-being-saved-with-salesforce_id-0 --- lib/salesforce_ar_sync/salesforce_sync.rb | 16 ++++++++++------ .../salesforce_ar_sync_spec.rb | 10 +++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/salesforce_ar_sync/salesforce_sync.rb b/lib/salesforce_ar_sync/salesforce_sync.rb index cc0feed..158bfe1 100644 --- a/lib/salesforce_ar_sync/salesforce_sync.rb +++ b/lib/salesforce_ar_sync/salesforce_sync.rb @@ -176,20 +176,24 @@ def is_boolean?(attribute) def salesforce_create_object(attributes) attributes[self.class.salesforce_web_id_attribute_name.to_s] = id if self.class.salesforce_sync_web_id? && !new_record? - salesforce_id = SF_CLIENT.create(salesforce_object_name, format_attributes(attributes)) - self.salesforce_id = salesforce_id - @exists_in_salesforce = true + salesforce_id = SF_CLIENT.create!(salesforce_object_name, format_attributes(attributes)) + if salesforce_id.present? && salesforce_id != 0 + self.salesforce_id = salesforce_id + @exists_in_salesforce = true + else + raise "Salesforce returned invalid ID: #{salesforce_id}" + end end def salesforce_update_object(attributes) attributes[self.class.salesforce_web_id_attribute_name.to_s] = id if self.class.salesforce_sync_web_id? && !new_record? - SF_CLIENT.update(salesforce_object_name, format_attributes(attributes).merge(Id: salesforce_id)) + SF_CLIENT.update!(salesforce_object_name, format_attributes(attributes).merge(Id: salesforce_id)) end def salesforce_delete_object if ar_sync_outbound_delete? - SF_CLIENT.destroy(salesforce_object_name, salesforce_id) + SF_CLIENT.destroy!(salesforce_object_name, salesforce_id) end end @@ -236,7 +240,7 @@ def salesforce_sync(*attrs) def sync_web_id return false if !self.class.salesforce_sync_web_id? || SalesforceArSync.config['SYNC_ENABLED'] == false - SF_CLIENT.update(salesforce_object_name, Id: salesforce_id, self.class.salesforce_web_id_attribute_name.to_s => get_activerecord_web_id) if salesforce_id + SF_CLIENT.update!(salesforce_object_name, Id: salesforce_id, self.class.salesforce_web_id_attribute_name.to_s => get_activerecord_web_id) if salesforce_id end def get_activerecord_web_id diff --git a/spec/salesforce_ar_sync/salesforce_ar_sync_spec.rb b/spec/salesforce_ar_sync/salesforce_ar_sync_spec.rb index 49d8e78..e2bba45 100644 --- a/spec/salesforce_ar_sync/salesforce_ar_sync_spec.rb +++ b/spec/salesforce_ar_sync/salesforce_ar_sync_spec.rb @@ -521,14 +521,14 @@ class ProcessUpdateTest < ActiveRecord::Base } ) - expect(SF_CLIENT).to receive(:update).with('Contact', expected_attributes) + expect(SF_CLIENT).to receive(:update!).with('Contact', expected_attributes) contact.salesforce_update_object(contact.attributes) end end context 'when the class should not sync web id' do it 'calls SF_CLIENT.update with the correct parameters' do - expect(SF_CLIENT).to receive(:update).with('Contact', contact.attributes.merge(Id: contact.salesforce_id)) + expect(SF_CLIENT).to receive(:update!).with('Contact', contact.attributes.merge(Id: contact.salesforce_id)) contact.salesforce_update_object(contact.attributes) end end @@ -549,14 +549,14 @@ class ProcessUpdateTest < ActiveRecord::Base SalesforceArSync.config['SYNC_ENABLED'] = true stub_const('SF_CLIENT', restforce_client_stub) - allow(SF_CLIENT).to receive(:update) + allow(SF_CLIENT).to receive(:update!) allow(contact).to receive(:salesforce_object_exists?).and_return(true) end context 'when supplied with which attributes to sync' do it 'calls SF_CLIENT.update with the correct parameters' do contact.salesforce_sync(:first_name, :email_address) - expect(SF_CLIENT).to have_received(:update).with( + expect(SF_CLIENT).to have_received(:update!).with( 'Contact', Id: contact.salesforce_id, Contact.salesforce_sync_attribute_mapping.invert[:first_name] => contact.first_name, @@ -568,7 +568,7 @@ class ProcessUpdateTest < ActiveRecord::Base context 'when supplied with invalid attributes to sync' do it 'calls SF_CLIENT.update with the correct parameters' do contact.salesforce_sync(:bad_attribute) - expect(SF_CLIENT).not_to have_received(:update) + expect(SF_CLIENT).not_to have_received(:update!) end end end From 89adcc3e3231b6edf7b1144cb248e552657524c9 Mon Sep 17 00:00:00 2001 From: Sam Gong Date: Mon, 8 Sep 2025 13:32:53 -0400 Subject: [PATCH 2/6] remove safe guide for salesforce_id 0, when use create! --- lib/salesforce_ar_sync/salesforce_sync.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/salesforce_ar_sync/salesforce_sync.rb b/lib/salesforce_ar_sync/salesforce_sync.rb index 158bfe1..8818ac5 100644 --- a/lib/salesforce_ar_sync/salesforce_sync.rb +++ b/lib/salesforce_ar_sync/salesforce_sync.rb @@ -177,12 +177,6 @@ def is_boolean?(attribute) def salesforce_create_object(attributes) attributes[self.class.salesforce_web_id_attribute_name.to_s] = id if self.class.salesforce_sync_web_id? && !new_record? salesforce_id = SF_CLIENT.create!(salesforce_object_name, format_attributes(attributes)) - if salesforce_id.present? && salesforce_id != 0 - self.salesforce_id = salesforce_id - @exists_in_salesforce = true - else - raise "Salesforce returned invalid ID: #{salesforce_id}" - end end def salesforce_update_object(attributes) From 4c69f1eb9a4093e6953f4f479ed347d22f3d7251 Mon Sep 17 00:00:00 2001 From: Sam Gong Date: Mon, 8 Sep 2025 13:38:50 -0400 Subject: [PATCH 3/6] add @exists_in_salesforce = true back --- lib/salesforce_ar_sync/salesforce_sync.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/salesforce_ar_sync/salesforce_sync.rb b/lib/salesforce_ar_sync/salesforce_sync.rb index 8818ac5..f4d6353 100644 --- a/lib/salesforce_ar_sync/salesforce_sync.rb +++ b/lib/salesforce_ar_sync/salesforce_sync.rb @@ -177,6 +177,7 @@ def is_boolean?(attribute) def salesforce_create_object(attributes) attributes[self.class.salesforce_web_id_attribute_name.to_s] = id if self.class.salesforce_sync_web_id? && !new_record? salesforce_id = SF_CLIENT.create!(salesforce_object_name, format_attributes(attributes)) + @exists_in_salesforce = true end def salesforce_update_object(attributes) From 0d84ba81f13cb839f0a4dd26d2a95fec34b095d2 Mon Sep 17 00:00:00 2001 From: Sam Gong Date: Mon, 8 Sep 2025 13:41:31 -0400 Subject: [PATCH 4/6] fix salesforce_sync.rb self.salesforce_id --- lib/salesforce_ar_sync/salesforce_sync.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/salesforce_ar_sync/salesforce_sync.rb b/lib/salesforce_ar_sync/salesforce_sync.rb index f4d6353..7efffc2 100644 --- a/lib/salesforce_ar_sync/salesforce_sync.rb +++ b/lib/salesforce_ar_sync/salesforce_sync.rb @@ -176,7 +176,7 @@ def is_boolean?(attribute) def salesforce_create_object(attributes) attributes[self.class.salesforce_web_id_attribute_name.to_s] = id if self.class.salesforce_sync_web_id? && !new_record? - salesforce_id = SF_CLIENT.create!(salesforce_object_name, format_attributes(attributes)) + self.salesforce_id = SF_CLIENT.create!(salesforce_object_name, format_attributes(attributes)) @exists_in_salesforce = true end From b534abe87c23324c3958676206c18dd526aa75c5 Mon Sep 17 00:00:00 2001 From: "Xianlin (Sam) Gong" <33271127+XianlinGong@users.noreply.github.com> Date: Wed, 10 Sep 2025 11:53:10 -0400 Subject: [PATCH 5/6] Update CHANGELOG.md Update CHANGELOG.md version 5.3.0 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afcee48..efc2e01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,3 +49,6 @@ # Version 5.2.1 * Reverted accidental change to object creation during sync. * Added CI for the test suite. + +# Version 5.3.0 +* Changed salesforce_ar_sync to use bang (!) versions of Restforce CRUD methods to raise errors on Salesforce save failures instead of returning false. From 1f09da154e3d21ae1e00ab4657bcfaf12038cb02 Mon Sep 17 00:00:00 2001 From: "Xianlin (Sam) Gong" <33271127+XianlinGong@users.noreply.github.com> Date: Wed, 10 Sep 2025 11:53:53 -0400 Subject: [PATCH 6/6] Update version.rb version.rb 5.3.0 --- lib/salesforce_ar_sync/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/salesforce_ar_sync/version.rb b/lib/salesforce_ar_sync/version.rb index 6586453..11e387c 100644 --- a/lib/salesforce_ar_sync/version.rb +++ b/lib/salesforce_ar_sync/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module SalesforceArSync - VERSION = '5.2.1' + VERSION = '5.3.0' end