diff --git a/.rubocop_todo/layout/space_inside_parens.yml b/.rubocop_todo/layout/space_inside_parens.yml
index 2ca34a4725c..fd3d68fbcef 100644
--- a/.rubocop_todo/layout/space_inside_parens.yml
+++ b/.rubocop_todo/layout/space_inside_parens.yml
@@ -3,7 +3,6 @@
Layout/SpaceInsideParens:
Exclude:
- 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
- - 'spec/lib/feature/gitaly_spec.rb'
- 'spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
- 'spec/lib/gitlab/ci/config/entry/reports_spec.rb'
- 'spec/lib/gitlab/ci/config/entry/trigger_spec.rb'
diff --git a/app/services/ci/runners/register_runner_service.rb b/app/services/ci/runners/register_runner_service.rb
index 550dfd3c29b..58e9a96395e 100644
--- a/app/services/ci/runners/register_runner_service.rb
+++ b/app/services/ci/runners/register_runner_service.rb
@@ -80,11 +80,12 @@ module Ci
def token_scope
case attrs_from_token[:runner_type]
+ when :instance_type
+ Gitlab::Audit::InstanceScope.new
when :project_type
attrs_from_token[:projects]&.first
when :group_type
attrs_from_token[:groups]&.first
- # No scope for instance type
end
end
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 573eaceffdb..cbfd3c32d24 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -31162,6 +31162,7 @@ Project-level settings for product analytics provider.
| `pendingMemberApprovals` **{warning-solid}** | [`MemberApprovalConnection`](#memberapprovalconnection) | **Introduced** in GitLab 17.3. **Status**: Experiment. Pending member promotions of the project. |
| `permanentDeletionDate` **{warning-solid}** | [`String`](#string) | **Introduced** in GitLab 16.11. **Status**: Experiment. Date when project will be deleted if delayed project deletion is enabled. |
| `pipelineTriggers` **{warning-solid}** | [`PipelineTriggerConnection`](#pipelinetriggerconnection) | **Introduced** in GitLab 16.3. **Status**: Experiment. List of pipeline trigger tokens. |
+| `preReceiveSecretDetectionEnabled` | [`Boolean`](#boolean) | Indicates whether Secret Push Protection is on or not for the project. |
| `preventMergeWithoutJiraIssueEnabled` | [`Boolean!`](#boolean) | Indicates if an associated issue from Jira is required. |
| `printingMergeRequestLinkEnabled` | [`Boolean`](#boolean) | Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line. |
| `productAnalyticsInstrumentationKey` **{warning-solid}** | [`String`](#string) | **Introduced** in GitLab 16.0. **Status**: Experiment. Product Analytics instrumentation key assigned to the project. |
diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md
index 11073d66684..606dc739bd3 100644
--- a/doc/development/i18n/proofreader.md
+++ b/doc/development/i18n/proofreader.md
@@ -68,6 +68,8 @@ are very appreciative of the work done by translators and proofreaders!
- Proofreaders needed.
- Indonesian
- Rahayu Rafika - [GitLab](https://gitlab.com/Vkfikaa), [Crowdin](https://crowdin.com/profile/rahayurafika_12)
+- Irish
+ - Aindriú Mac Giolla Eoin - [GitLab](https://gitlab.com/aindriu80), [Crowdin](https://crowdin.com/profile/aindriu80)
- Italian
- Proofreaders needed.
- Japanese
diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb
index a0c118b0a69..2010aeb5b7b 100644
--- a/spec/features/dashboard/todos/todos_spec.rb
+++ b/spec/features/dashboard/todos/todos_spec.rb
@@ -548,6 +548,8 @@ RSpec.describe 'Dashboard Todos (Vue version)', :js, feature_category: :notifica
let_it_be(:user2) { create(:user, name: 'Michael Scott') }
let_it_be(:project) { create(:project, :public, developers: user) }
let_it_be(:issue) { create(:issue, project: project, due_date: Date.today, title: "Fix bug") }
+ let_it_be(:issue2) { create(:issue, project: project, due_date: Date.today, title: "Update gems") }
+ let_it_be(:issue3) { create(:issue, project: project, due_date: Date.today, title: "Deploy feature") }
before do
sign_in user
@@ -595,12 +597,11 @@ RSpec.describe 'Dashboard Todos (Vue version)', :js, feature_category: :notifica
context 'when user has no done tasks' do
before do
create_todo(state: :pending)
- visit dashboard_todos_path(author_id: user.id)
- click_on 'Done'
end
context 'with filters applied' do
it 'shows a "no matches" message' do
+ visit dashboard_todos_path(author_id: user.id, state: :done)
expect(page).to have_content 'Sorry, your filter produced no results'
expect_tab_nav
end
@@ -608,7 +609,7 @@ RSpec.describe 'Dashboard Todos (Vue version)', :js, feature_category: :notifica
context 'with no filters applied' do
it 'shows a "no done todos" message on the "Done" tab' do
- click_on 'Clear'
+ visit dashboard_todos_path(state: :done)
expect(page).to have_content 'There are no done to-do items yet'
expect_tab_nav
end
@@ -617,13 +618,11 @@ RSpec.describe 'Dashboard Todos (Vue version)', :js, feature_category: :notifica
end
context 'when user has pending todos' do
- let!(:todo_assigned) { create(:todo, :assigned, :pending, user: user, project: project, target: issue, author: user2) }
- let!(:todo_marked) { create(:todo, :marked, :pending, user: user, project: project, target: issue, author: user) }
+ let_it_be(:todo_assigned) { create(:todo, :assigned, :pending, user: user, project: project, target: issue, author: user2) }
+ let_it_be(:todo_marked) { create(:todo, :marked, :pending, user: user, project: project, target: issue, author: user) }
before do
- sign_in(user)
visit dashboard_todos_path
- wait_for_requests
end
it 'allows to mark a pending todo as done and find it in the Done tab' do
@@ -642,8 +641,84 @@ RSpec.describe 'Dashboard Todos (Vue version)', :js, feature_category: :notifica
end
end
- def create_todo(state:)
- create(:todo, :assigned, state, user: user, project: project, target: issue, author: user2)
+ describe 'sorting' do
+ let_it_be(:oldest_but_most_recently_updated) { create_todo(created_at: 3.days.ago, updated_at: 3.minutes.ago, target: issue) }
+ let_it_be(:middle_old_and_middle_updated) { create_todo(created_at: 2.days.ago, updated_at: 2.hours.ago, target: issue2) }
+ let_it_be(:newest_but_never_updated) { create_todo(created_at: 1.day.ago, updated_at: 1.day.ago, target: issue3) }
+
+ before do
+ visit dashboard_todos_path
+ end
+
+ it 'allows to change sort order and direction' do
+ # default sort is by `created_at` (desc)
+ expect(page).to have_content(
+ /#{newest_but_never_updated.target.title}.*#{middle_old_and_middle_updated.target.title}.*#{oldest_but_most_recently_updated.target.title}/
+ )
+
+ # change direction
+ find('.sorting-direction-button').click
+ expect(page).to have_content(
+ /#{oldest_but_most_recently_updated.target.title}.*#{middle_old_and_middle_updated.target.title}.*#{newest_but_never_updated.target.title}/
+ )
+
+ # change order
+ click_on 'Created' # to open order dropdown
+ find('li', text: 'Updated').click # to change to `updated_at`
+ expect(page).to have_content(
+ /#{newest_but_never_updated.target.title}.*#{middle_old_and_middle_updated.target.title}.*#{oldest_but_most_recently_updated.target.title}/
+ )
+ end
+ end
+
+ describe 'filtering' do
+ let_it_be(:self_assigned) { create_todo(author: user, target: issue) }
+ let_it_be(:self_marked) { create_todo(author: user, target: issue2, action: :marked) }
+ let_it_be(:other_assigned) { create_todo(author: user2, target: issue3) }
+
+ before do
+ visit dashboard_todos_path
+ end
+
+ it 'allows to filter by auther, action etc' do
+ find_by_testid('filtered-search-term').click
+ find('li', text: 'Author').click
+ find('li', text: user.username).click
+ find_by_testid('search-button').click
+
+ expect(page).to have_content(self_assigned.target.title)
+ expect(page).to have_content(self_marked.target.title)
+ expect(page).not_to have_content(other_assigned.target.title)
+
+ find_by_testid('filtered-search-term').click
+ find('li', text: 'Reason').click
+ find('li', text: 'Marked').click
+ find_by_testid('search-button').click
+
+ expect(page).not_to have_content(self_assigned.target.title)
+ expect(page).to have_content(self_marked.target.title)
+ expect(page).not_to have_content(other_assigned.target.title)
+
+ click_on 'Clear'
+
+ expect(page).to have_content(self_assigned.target.title)
+ expect(page).to have_content(self_marked.target.title)
+ expect(page).to have_content(other_assigned.target.title)
+ end
+ end
+
+ def create_todo(action: :assigned, state: :pending, created_at: nil, updated_at: nil, target: issue, author: user2)
+ create(
+ :todo,
+ action,
+ state: state,
+ user: user,
+ created_at: created_at,
+ updated_at: updated_at,
+ project: project,
+ target: target,
+ author: author
+ )
end
def expect_tab_nav
diff --git a/spec/lib/feature/gitaly_spec.rb b/spec/lib/feature/gitaly_spec.rb
index dacd1fcb212..d55f12459ef 100644
--- a/spec/lib/feature/gitaly_spec.rb
+++ b/spec/lib/feature/gitaly_spec.rb
@@ -270,7 +270,7 @@ RSpec.describe Feature::Gitaly do
end
describe ".group_actor" do
- let_it_be(:group) { create(:group ) }
+ let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
context 'when project is passed in' do