Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
8924515456
commit
22ed58450d
|
@ -117,7 +117,7 @@ export default {
|
|||
this.$emit('clear');
|
||||
},
|
||||
},
|
||||
defaultQueryOptions: { exclude_internal: true, active: true },
|
||||
defaultQueryOptions: { without_project_bots: true, active: true },
|
||||
i18n: {
|
||||
inviteTextMessage: __('Invite "%{email}" by email'),
|
||||
},
|
||||
|
|
|
@ -47,6 +47,7 @@ class UsersFinder
|
|||
users = by_without_projects(users)
|
||||
users = by_custom_attributes(users)
|
||||
users = by_non_internal(users)
|
||||
users = by_without_project_bots(users)
|
||||
|
||||
order(users)
|
||||
end
|
||||
|
@ -138,6 +139,12 @@ class UsersFinder
|
|||
users.non_internal
|
||||
end
|
||||
|
||||
def by_without_project_bots(users)
|
||||
return users unless params[:without_project_bots]
|
||||
|
||||
users.without_project_bot
|
||||
end
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def order(users)
|
||||
return users unless params[:sort]
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
- name: "GitLab self-monitoring" # The name of the feature to be deprecated
|
||||
- name: "GitLab self-monitoring project" # The name of the feature to be deprecated
|
||||
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
|
||||
announcement_date: "2022-03-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
|
||||
removal_date: "2022-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
|
||||
removal_date: "2023-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
breaking_change: true # If this deprecation is a breaking change, set this value to true
|
||||
reporter: abellucci # GitLab username of the person reporting the deprecation
|
||||
body: | # Do not modify this line, instead modify the lines below.
|
||||
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 15.0.
|
||||
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 16.0.
|
||||
# The following items are not published on the docs page, but may be used in the future.
|
||||
stage: Monitor # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
|
||||
tiers: [Core, Premium, Ultimate] # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
- name: "Monitor performance metrics through Prometheus" # The name of the feature to be deprecated
|
||||
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
|
||||
announcement_date: "2022-01-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
|
||||
removal_date: "2022-05-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
removal_milestone: "16.0" # The milestone when this feature is planned to be removed
|
||||
removal_date: "2023-05-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
breaking_change: true # If this deprecation is a breaking change, set this value to true
|
||||
body: | # Do not modify this line, instead modify the lines below.
|
||||
By displaying data stored in a Prometheus instance, GitLab allows users to view performance metrics. GitLab also displays visualizations of these metrics in dashboards. The user can connect to a previously-configured external Prometheus instance, or set up Prometheus as a GitLab Managed App.
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddIndexToVulnerabilities < Gitlab::Database::Migration[1.0]
|
||||
INDEX_NAME = 'index_vulnerabilites_common_finder_query'
|
||||
|
||||
disable_ddl_transaction!
|
||||
|
||||
def up
|
||||
add_concurrent_index(
|
||||
:vulnerabilities,
|
||||
%i[project_id state report_type severity id],
|
||||
name: INDEX_NAME
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name(
|
||||
:vulnerabilities,
|
||||
INDEX_NAME
|
||||
)
|
||||
end
|
||||
end
|
|
@ -0,0 +1 @@
|
|||
beeab3a2197f11a40049e983a5184ab9b80370c9867461239e12a5ce36b8f5e8
|
|
@ -29382,6 +29382,8 @@ CREATE UNIQUE INDEX index_vuln_historical_statistics_on_project_id_and_date ON v
|
|||
|
||||
CREATE INDEX index_vuln_reads_on_project_id_state_severity_and_vuln_id ON vulnerability_reads USING btree (project_id, state, severity, vulnerability_id DESC);
|
||||
|
||||
CREATE INDEX index_vulnerabilites_common_finder_query ON vulnerabilities USING btree (project_id, state, report_type, severity, id);
|
||||
|
||||
CREATE INDEX index_vulnerabilities_on_author_id ON vulnerabilities USING btree (author_id);
|
||||
|
||||
CREATE INDEX index_vulnerabilities_on_confirmed_by_id ON vulnerabilities USING btree (confirmed_by_id);
|
||||
|
|
|
@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32351) in GitLab 12.7 [with a flag](../../feature_flags.md) named `self_monitoring_project`. Disabled by default.
|
||||
> - Generally available in GitLab 12.8. [Feature flag `self_monitoring_project`](https://gitlab.com/gitlab-org/gitlab/-/issues/198511) removed.
|
||||
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909) in GitLab 14.9. Planned for removal in GitLab 15.0.
|
||||
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909) in GitLab 14.9. Planned for removal in GitLab 16.0.
|
||||
|
||||
WARNING:
|
||||
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909)
|
||||
|
|
|
@ -97,6 +97,14 @@ In addition, to exclude external users from the users' list, you can use the par
|
|||
GET /users?exclude_external=true
|
||||
```
|
||||
|
||||
To exclude [bot users for projects](../user/project/settings/project_access_tokens.md#bot-users-for-projects)
|
||||
and [bot users for groups](../user/group/settings/group_access_tokens.md#bot-users-for-groups), you can use the
|
||||
parameter `without_project_bots=true`.
|
||||
|
||||
```plaintext
|
||||
GET /users?without_project_bots=true
|
||||
```
|
||||
|
||||
### For admins
|
||||
|
||||
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
|
||||
|
|
|
@ -75,17 +75,17 @@ In 15.0, support for daemon mode for GitLab Pages will be removed.
|
|||
|
||||
**Planned removal milestone: 15.0 (2022-05-22)**
|
||||
|
||||
### GitLab self-monitoring
|
||||
### GitLab self-monitoring project
|
||||
|
||||
WARNING:
|
||||
This feature will be changed or removed in 15.0
|
||||
This feature will be changed or removed in 16.0
|
||||
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
||||
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||
changes to your code, settings, or workflow.
|
||||
|
||||
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 15.0.
|
||||
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 16.0.
|
||||
|
||||
**Planned removal milestone: 15.0 (2022-05-22)**
|
||||
**Planned removal milestone: 16.0 (2023-05-22)**
|
||||
|
||||
### GraphQL permissions change for Package settings
|
||||
|
||||
|
@ -994,7 +994,7 @@ The logging features in GitLab allow users to install the ELK stack (Elasticsear
|
|||
### Monitor performance metrics through Prometheus
|
||||
|
||||
WARNING:
|
||||
This feature will be changed or removed in 15.0
|
||||
This feature will be changed or removed in 16.0
|
||||
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
||||
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||
changes to your code, settings, or workflow.
|
||||
|
@ -1002,7 +1002,7 @@ changes to your code, settings, or workflow.
|
|||
By displaying data stored in a Prometheus instance, GitLab allows users to view performance metrics. GitLab also displays visualizations of these metrics in dashboards. The user can connect to a previously-configured external Prometheus instance, or set up Prometheus as a GitLab Managed App.
|
||||
However, since certificate-based integration with Kubernetes clusters is deprecated in GitLab, the metrics functionality in GitLab that relies on Prometheus is also deprecated. This includes the metrics visualizations in dashboards. GitLab is working to develop a single user experience based on [Opstrace](https://about.gitlab.com/press/releases/2021-12-14-gitlab-acquires-opstrace-to-expand-its-devops-platform-with-open-source-observability-solution.html). An [issue exists](https://gitlab.com/groups/gitlab-org/-/epics/6976) for you to follow work on the Opstrace integration.
|
||||
|
||||
**Planned removal milestone: 15.0 (2022-05-22)**
|
||||
**Planned removal milestone: 16.0 (2023-05-22)**
|
||||
|
||||
### Pseudonymizer
|
||||
|
||||
|
|
|
@ -936,7 +936,7 @@ To use SAST in an offline environment, you need:
|
|||
- A Docker Container Registry with locally available copies of SAST [analyzer](https://gitlab.com/gitlab-org/security-products/analyzers) images.
|
||||
- Configure certificate checking of packages (optional).
|
||||
|
||||
GitLab Runner has a [default `pull policy` of `always`](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy),
|
||||
GitLab Runner has a [default `pull_policy` of `always`](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy),
|
||||
meaning the runner tries to pull Docker images from the GitLab container registry even if a local
|
||||
copy is available. The GitLab Runner [`pull_policy` can be set to `if-not-present`](https://docs.gitlab.com/runner/executors/docker.html#using-the-if-not-present-pull-policy)
|
||||
in an offline environment if you prefer using only locally available Docker images. However, we
|
||||
|
|
|
@ -89,6 +89,7 @@ module API
|
|||
optional :created_before, type: DateTime, desc: 'Return users created before the specified time'
|
||||
optional :without_projects, type: Boolean, default: false, desc: 'Filters only users without projects'
|
||||
optional :exclude_internal, as: :non_internal, type: Boolean, default: false, desc: 'Filters only non internal users'
|
||||
optional :without_project_bots, type: Boolean, default: false, desc: 'Filters users without project bots'
|
||||
optional :admins, type: Boolean, default: false, desc: 'Filters only admin users'
|
||||
all_or_none_of :extern_uid, :provider
|
||||
|
||||
|
|
|
@ -63,25 +63,6 @@ RSpec.describe 'Groups > Members > Manage members' do
|
|||
)
|
||||
end
|
||||
|
||||
it 'do not disclose email addresses', :js do
|
||||
group.add_owner(user1)
|
||||
create(:user, email: 'undisclosed_email@gitlab.com', name: "Jane 'invisible' Doe")
|
||||
|
||||
visit group_group_members_path(group)
|
||||
|
||||
click_on 'Invite members'
|
||||
find('[data-testid="members-token-select-input"]').set('@gitlab.com')
|
||||
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_content('No matches found')
|
||||
|
||||
find('[data-testid="members-token-select-input"]').set('undisclosed_email@gitlab.com')
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_content('Invite "undisclosed_email@gitlab.com" by email')
|
||||
end
|
||||
|
||||
it 'remove user from group', :js do
|
||||
group.add_owner(user1)
|
||||
group.add_developer(user2)
|
||||
|
@ -169,4 +150,57 @@ RSpec.describe 'Groups > Members > Manage members' do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'member search results', :js do
|
||||
before do
|
||||
group.add_owner(user1)
|
||||
end
|
||||
|
||||
it 'does not disclose email addresses' do
|
||||
create(:user, email: 'undisclosed_email@gitlab.com', name: "Jane 'invisible' Doe")
|
||||
|
||||
visit group_group_members_path(group)
|
||||
|
||||
click_on 'Invite members'
|
||||
find(member_dropdown_selector).set('@gitlab.com')
|
||||
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_content('No matches found')
|
||||
|
||||
find(member_dropdown_selector).set('undisclosed_email@gitlab.com')
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_content('Invite "undisclosed_email@gitlab.com" by email')
|
||||
end
|
||||
|
||||
it 'does not show project_bots', :aggregate_failures do
|
||||
internal_project_bot = create(:user, :project_bot, name: '_internal_project_bot_')
|
||||
project = create(:project, group: group)
|
||||
project.add_maintainer(internal_project_bot)
|
||||
|
||||
external_group = create(:group)
|
||||
external_project_bot = create(:user, :project_bot, name: '_external_project_bot_')
|
||||
external_project = create(:project, group: external_group)
|
||||
external_project.add_maintainer(external_project_bot)
|
||||
external_project.add_maintainer(user1)
|
||||
|
||||
visit group_group_members_path(group)
|
||||
|
||||
click_on 'Invite members'
|
||||
|
||||
page.within invite_modal_selector do
|
||||
field = find(member_dropdown_selector)
|
||||
field.native.send_keys :tab
|
||||
field.click
|
||||
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_content(user1.name)
|
||||
expect(page).to have_content(user2.name)
|
||||
expect(page).not_to have_content(internal_project_bot.name)
|
||||
expect(page).not_to have_content(external_project_bot.name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe 'Project members list', :js do
|
||||
RSpec.describe 'Projects > Members > Manage members', :js do
|
||||
include Spec::Support::Helpers::Features::MembersHelpers
|
||||
include Spec::Support::Helpers::Features::InviteMembersModalHelper
|
||||
include Spec::Support::Helpers::ModalHelpers
|
||||
|
@ -124,6 +124,36 @@ RSpec.describe 'Project members list', :js do
|
|||
)
|
||||
end
|
||||
|
||||
describe 'member search results' do
|
||||
it 'does not show project_bots', :aggregate_failures do
|
||||
internal_project_bot = create(:user, :project_bot, name: '_internal_project_bot_')
|
||||
project.add_maintainer(internal_project_bot)
|
||||
|
||||
external_group = create(:group)
|
||||
external_project_bot = create(:user, :project_bot, name: '_external_project_bot_')
|
||||
external_project = create(:project, group: external_group)
|
||||
external_project.add_maintainer(external_project_bot)
|
||||
external_project.add_maintainer(user1)
|
||||
|
||||
visit_members_page
|
||||
|
||||
click_on 'Invite members'
|
||||
|
||||
page.within invite_modal_selector do
|
||||
field = find(member_dropdown_selector)
|
||||
field.native.send_keys :tab
|
||||
field.click
|
||||
|
||||
wait_for_requests
|
||||
|
||||
expect(page).to have_content(user1.name)
|
||||
expect(page).to have_content(user2.name)
|
||||
expect(page).not_to have_content(internal_project_bot.name)
|
||||
expect(page).not_to have_content(external_project_bot.name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'as a signed out visitor viewing a public project' do
|
||||
let_it_be(:project) { create(:project, :public) }
|
||||
|
|
@ -6,13 +6,15 @@ RSpec.describe UsersFinder do
|
|||
describe '#execute' do
|
||||
include_context 'UsersFinder#execute filter by project context'
|
||||
|
||||
let_it_be(:project_bot) { create(:user, :project_bot) }
|
||||
|
||||
context 'with a normal user' do
|
||||
let(:user) { create(:user) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
it 'returns all users' do
|
||||
users = described_class.new(user).execute
|
||||
|
||||
expect(users).to contain_exactly(user, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user)
|
||||
expect(users).to contain_exactly(user, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user, project_bot)
|
||||
end
|
||||
|
||||
it 'filters by username' do
|
||||
|
@ -54,7 +56,7 @@ RSpec.describe UsersFinder do
|
|||
it 'filters by active users' do
|
||||
users = described_class.new(user, active: true).execute
|
||||
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, omniauth_user, admin_user)
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, omniauth_user, admin_user, project_bot)
|
||||
end
|
||||
|
||||
it 'filters by external users' do
|
||||
|
@ -66,7 +68,7 @@ RSpec.describe UsersFinder do
|
|||
it 'filters by non external users' do
|
||||
users = described_class.new(user, non_external: true).execute
|
||||
|
||||
expect(users).to contain_exactly(user, normal_user, blocked_user, omniauth_user, internal_user, admin_user)
|
||||
expect(users).to contain_exactly(user, normal_user, blocked_user, omniauth_user, internal_user, admin_user, project_bot)
|
||||
end
|
||||
|
||||
it 'filters by created_at' do
|
||||
|
@ -83,7 +85,13 @@ RSpec.describe UsersFinder do
|
|||
it 'filters by non internal users' do
|
||||
users = described_class.new(user, non_internal: true).execute
|
||||
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, blocked_user, omniauth_user, admin_user)
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, blocked_user, omniauth_user, admin_user, project_bot)
|
||||
end
|
||||
|
||||
it 'filters by without project bots' do
|
||||
users = described_class.new(user, without_project_bots: true).execute
|
||||
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, blocked_user, omniauth_user, internal_user, admin_user)
|
||||
end
|
||||
|
||||
it 'does not filter by custom attributes' do
|
||||
|
@ -92,23 +100,23 @@ RSpec.describe UsersFinder do
|
|||
custom_attributes: { foo: 'bar' }
|
||||
).execute
|
||||
|
||||
expect(users).to contain_exactly(user, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user)
|
||||
expect(users).to contain_exactly(user, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user, project_bot)
|
||||
end
|
||||
|
||||
it 'orders returned results' do
|
||||
users = described_class.new(user, sort: 'id_asc').execute
|
||||
|
||||
expect(users).to eq([normal_user, admin_user, blocked_user, external_user, omniauth_user, internal_user, user])
|
||||
expect(users).to eq([normal_user, admin_user, blocked_user, external_user, omniauth_user, internal_user, project_bot, user])
|
||||
end
|
||||
|
||||
it 'does not filter by admins' do
|
||||
users = described_class.new(user, admins: true).execute
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, admin_user, blocked_user, omniauth_user, internal_user)
|
||||
expect(users).to contain_exactly(user, normal_user, external_user, admin_user, blocked_user, omniauth_user, internal_user, project_bot)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with an admin user', :enable_admin_mode do
|
||||
let(:admin) { create(:admin) }
|
||||
let_it_be(:admin) { create(:admin) }
|
||||
|
||||
it 'filters by external users' do
|
||||
users = described_class.new(admin, external: true).execute
|
||||
|
@ -119,7 +127,7 @@ RSpec.describe UsersFinder do
|
|||
it 'returns all users' do
|
||||
users = described_class.new(admin).execute
|
||||
|
||||
expect(users).to contain_exactly(admin, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user)
|
||||
expect(users).to contain_exactly(admin, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user, project_bot)
|
||||
end
|
||||
|
||||
it 'returns only admins' do
|
||||
|
|
|
@ -95,7 +95,7 @@ describe('MembersTokenSelect', () => {
|
|||
|
||||
expect(UserApi.getUsers).toHaveBeenCalledWith(searchParam, {
|
||||
active: true,
|
||||
exclude_internal: true,
|
||||
without_project_bots: true,
|
||||
});
|
||||
expect(tokenSelector.props('hideDropdownWithNoItems')).toBe(false);
|
||||
});
|
||||
|
@ -172,7 +172,7 @@ describe('MembersTokenSelect', () => {
|
|||
|
||||
expect(UserApi.getUsers).toHaveBeenCalledWith(searchParam, {
|
||||
active: true,
|
||||
exclude_internal: true,
|
||||
without_project_bots: true,
|
||||
saml_provider_id: samlProviderId,
|
||||
});
|
||||
});
|
||||
|
|
|
@ -359,6 +359,26 @@ RSpec.describe API::Users do
|
|||
end
|
||||
end
|
||||
|
||||
context 'without_project_bots param' do
|
||||
let_it_be(:project_bot) { create(:user, :project_bot) }
|
||||
|
||||
it 'returns all users when it is not set' do
|
||||
get api("/users?without_project_bots=false", user)
|
||||
|
||||
expect(response).to match_response_schema('public_api/v4/user/basics')
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response.map { |u| u['id'] }).to include(project_bot.id)
|
||||
end
|
||||
|
||||
it 'returns all non project_bot users when it is set' do
|
||||
get api("/users?without_project_bots=true", user)
|
||||
|
||||
expect(response).to match_response_schema('public_api/v4/user/basics')
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response.map { |u| u['id'] }).not_to include(project_bot.id)
|
||||
end
|
||||
end
|
||||
|
||||
context 'admins param' do
|
||||
it 'returns all users' do
|
||||
get api("/users?admins=true", user)
|
||||
|
|
|
@ -8,8 +8,8 @@ module Spec
|
|||
def invite_member(name, role: 'Guest', expires_at: nil)
|
||||
click_on 'Invite members'
|
||||
|
||||
page.within '[data-testid="invite-modal"]' do
|
||||
find('[data-testid="members-token-select-input"]').set(name)
|
||||
page.within invite_modal_selector do
|
||||
find(member_dropdown_selector).set(name)
|
||||
|
||||
wait_for_requests
|
||||
click_button name
|
||||
|
@ -53,6 +53,14 @@ module Spec
|
|||
'[data-testid="group-select-dropdown"]'
|
||||
end
|
||||
|
||||
def member_dropdown_selector
|
||||
'[data-testid="members-token-select-input"]'
|
||||
end
|
||||
|
||||
def invite_modal_selector
|
||||
'[data-testid="invite-modal"]'
|
||||
end
|
||||
|
||||
def expect_to_have_group(group)
|
||||
expect(page).to have_selector("[entity-id='#{group.id}']")
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue