Fix duplicate members when filtering for group

https://community.openproject.org/wp/45331
pull/11772/head
Oliver Günther 2 years ago
parent 1ea520e17f
commit 37aec2f4c2
No known key found for this signature in database
GPG Key ID: A3A8BDAD7C0C552C
  1. 2
      app/models/queries/members/filters/group_filter.rb
  2. 2
      spec/models/queries/members/filters/group_filter_spec.rb
  3. 53
      spec/models/queries/members/members_query_integration_spec.rb

@ -34,7 +34,7 @@ class Queries::Members::Filters::GroupFilter < Queries::Members::Filters::Member
end end
def scope def scope
scope = model.joins(:principal).merge(User.joins(:groups)) scope = model.joins(:principal)
scope.where(where) scope.where(where)
end end
end end

@ -54,7 +54,7 @@ describe Queries::Members::Filters::GroupFilter, type: :model do
end end
it_behaves_like 'list_optional group query filter' do it_behaves_like 'list_optional group query filter' do
let(:model) { Member.joins(:principal).merge(User.joins(:groups)) } let(:model) { Member.joins(:principal) }
let(:valid_values) { [group1.id.to_s] } let(:valid_values) { [group1.id.to_s] }
end end
end end

@ -0,0 +1,53 @@
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2022 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
#++
require 'spec_helper'
describe Queries::Members::MemberQuery, 'Integration', type: :model do
let(:instance) { described_class.new }
current_user { user }
subject { instance.results }
context 'with two groups in a project' do
let(:project) { create(:project) }
let(:user) { create(:user) }
let(:role) { create(:role, permissions: %i[view_members manage_members]) }
let!(:group1) { create(:group, name: 'A', member_in_project: project, member_through_role: role, members: [user]) }
let!(:group2) { create(:group, name: 'B', member_in_project: project, member_through_role: role, members: [user]) }
it 'only returns one user when filtering for one group (Regression #45331)' do
instance.where 'project_id', '=', [project.id.to_s]
instance.where 'group', '=', [group1.id.to_s]
expect(subject.count).to eq 1
expect(subject.first.user_id).to eq user.id
end
end
end
Loading…
Cancel
Save