diff --git a/app/models/mixins/ownership_mixin.rb b/app/models/mixins/ownership_mixin.rb index c2c89335b24..a0a4fbec97f 100644 --- a/app/models/mixins/ownership_mixin.rb +++ b/app/models/mixins/ownership_mixin.rb @@ -77,15 +77,25 @@ def set_ownership(ids, options) def user_or_group_owned(user, miq_group) if user && miq_group - where("evm_owner_id" => user.id).or(where("miq_group_id" => miq_group.id)) + user_owned(user).or(group_owned(miq_group)) elsif user - where("evm_owner_id" => user.id) + user_owned(user) elsif miq_group - where("miq_group_id" => miq_group.id) + group_owned(miq_group) else none end end + + private + + def user_owned(user) + where(arel_table.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_attribute(:evm_owner_userid)]).eq(user.userid))) + end + + def group_owned(miq_group) + where(:miq_group_id => miq_group.id) + end end def owned_by_current_user diff --git a/spec/support/examples_group/shared_examples_for_ownership_mixin.rb b/spec/support/examples_group/shared_examples_for_ownership_mixin.rb index 89367478e0d..37e9747de44 100644 --- a/spec/support/examples_group/shared_examples_for_ownership_mixin.rb +++ b/spec/support/examples_group/shared_examples_for_ownership_mixin.rb @@ -151,6 +151,60 @@ end end + describe ".user_or_group_owned" do + let(:factory) { described_class.name == "Vm" ? :vm_vmware : described_class.table_name.singularize } + let(:owned_resource) { FactoryGirl.create(factory) } + let(:owning_user) { + FactoryGirl.create :user, :userid => "user_owner", :miq_groups => FactoryGirl.create_list(:miq_group, 1) + } + + context "by user in this region" do + it "returns resource owned by user" do + owned_resource.evm_owner = owning_user + owned_resource.save! + + expect(described_class.user_or_group_owned(owning_user, nil)).to eq([owned_resource]) + end + + it "returns resource owned by user or group" do + owned_resource.evm_owner = owning_user + owned_resource.save! + + expect(described_class.user_or_group_owned(owning_user, owning_user.current_group)).to eq([owned_resource]) + end + end + + context "by user in a remote region" do + let(:remote_owning_user) { FactoryGirl.create :user, :id => remote_id, :userid => "user_owner" } + let(:remote_id) do + my_region_number = ApplicationRecord.my_region_number + remote_region_number = my_region_number + 1 + ApplicationRecord.region_to_range(remote_region_number).first + end + + it "returns resource owned by user" do + owned_resource.id = remote_id + owned_resource.evm_owner = remote_owning_user + owned_resource.save! + + expect(owned_resource.evm_owner_id).not_to eq(owning_user.id) + expect(described_class.user_or_group_owned(owning_user, nil)).to eq([owned_resource]) + end + + it "returns resource owned by user or group" do + remote_owning_user.current_group = remote_owning_user.miq_groups.first + remote_owning_user.save! + + owned_resource.id = remote_id + owned_resource.evm_owner = remote_owning_user + owned_resource.save! + + expect(owned_resource.evm_owner_id).not_to eq(owning_user.id) + expect(described_class.user_or_group_owned(owning_user, owning_user.current_group)).to eq([owned_resource]) + end + end + end + describe ".owned_by_current_user" do before { User.current_user = user }