From 30d0a5242ee7eb68bec5ba8520768d2dd04be0e3 Mon Sep 17 00:00:00 2001 From: Mike Campbell Date: Thu, 18 Aug 2022 10:03:36 +0100 Subject: [PATCH] Fix global record validations with existing scope Due to how the `args` object was being (man)handled, we were leaking the tenant scope into the global scope validation where it shouldn't have been. This only happened when there was a scope argument supplied to validates_uniquness_to_tenant. --- lib/acts_as_tenant/model_extensions.rb | 4 ++-- spec/dummy/app/models/global_project_with_scope.rb | 6 ++++++ spec/dummy/db/schema.rb | 1 + spec/fixtures/global_projects.yml | 4 ++++ spec/models/model_extensions_spec.rb | 8 ++++++++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 spec/dummy/app/models/global_project_with_scope.rb diff --git a/lib/acts_as_tenant/model_extensions.rb b/lib/acts_as_tenant/model_extensions.rb index dd5211d..08aac35 100644 --- a/lib/acts_as_tenant/model_extensions.rb +++ b/lib/acts_as_tenant/model_extensions.rb @@ -105,9 +105,9 @@ def validates_uniqueness_to_tenant(fields, args = {}) fkey = reflect_on_association(ActsAsTenant.tenant_klass).foreign_key - validation_args = args.clone + validation_args = args.deep_dup validation_args[:scope] = if args[:scope] - Array(args[:scope]) << fkey + Array(args[:scope]) + [fkey] else fkey end diff --git a/spec/dummy/app/models/global_project_with_scope.rb b/spec/dummy/app/models/global_project_with_scope.rb new file mode 100644 index 0000000..18698e7 --- /dev/null +++ b/spec/dummy/app/models/global_project_with_scope.rb @@ -0,0 +1,6 @@ +class GlobalProjectWithScope < ActiveRecord::Base + self.table_name = "projects" + + acts_as_tenant :account, has_global_records: true + validates_uniqueness_to_tenant :name, scope: [:user_defined_scope] +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index d68caa9..d17a4b9 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -21,6 +21,7 @@ create_table :projects, force: true do |t| t.column :name, :string t.column :account_id, :integer + t.column :user_defined_scope, :string end create_table :managers, force: true do |t| diff --git a/spec/fixtures/global_projects.yml b/spec/fixtures/global_projects.yml index 84904f1..ad7afac 100644 --- a/spec/fixtures/global_projects.yml +++ b/spec/fixtures/global_projects.yml @@ -11,3 +11,7 @@ global_foo: global_bar: account: bar name: "global bar" + +global_scope: + name: "global scope" + user_defined_scope: abc diff --git a/spec/models/model_extensions_spec.rb b/spec/models/model_extensions_spec.rb index 29024da..97928a3 100644 --- a/spec/models/model_extensions_spec.rb +++ b/spec/models/model_extensions_spec.rb @@ -164,6 +164,14 @@ it "is invalid if tenant record conflicts with global record" do expect(GlobalProject.new(name: "global").valid?).to be(false) end + + it "is invalid if tenant record conflicts with global record with scope" do + duplicate = GlobalProjectWithScope.new( + name: "global scope", + user_defined_scope: "abc" + ) + expect(duplicate.valid?).to be(false) + end end context "should validate global records against global & tenant records" do