Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
0da3ea5374
commit
19d46f60a3
|
@ -37,7 +37,7 @@ If applicable, any groups/projects that are happy to have this feature turned on
|
||||||
- [ ] Enable on GitLab.com for individual groups/projects listed above and verify behaviour (`/chatops run feature set --project=gitlab-org/gitlab feature_name true`)
|
- [ ] Enable on GitLab.com for individual groups/projects listed above and verify behaviour (`/chatops run feature set --project=gitlab-org/gitlab feature_name true`)
|
||||||
- [ ] Coordinate a time to enable the flag with the SRE oncall and release managers
|
- [ ] Coordinate a time to enable the flag with the SRE oncall and release managers
|
||||||
- In `#production` mention `@sre-oncall` and `@release-managers`. Once an SRE on call and Release Manager on call confirm, you can proceed with the rollout
|
- In `#production` mention `@sre-oncall` and `@release-managers`. Once an SRE on call and Release Manager on call confirm, you can proceed with the rollout
|
||||||
- [ ] Announce on the issue an estimated time this will be enabled on GitLab.com
|
- [ ] Announce on the issue an estimated time this will be enabled on GitLab.com. **Note**: Once a feature rollout has started, it is not necessary to inform `@sre-oncall`/`@release-managers` at each stage of the gradual rollout.
|
||||||
- [ ] Enable on GitLab.com by running chatops command in `#production` (`/chatops run feature set feature_name true`)
|
- [ ] Enable on GitLab.com by running chatops command in `#production` (`/chatops run feature set feature_name true`)
|
||||||
- [ ] Cross post chatops Slack command to `#support_gitlab-com` ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#where-to-run-commands)) and in your team channel
|
- [ ] Cross post chatops Slack command to `#support_gitlab-com` ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#where-to-run-commands)) and in your team channel
|
||||||
- [ ] Announce on the issue that the flag has been enabled
|
- [ ] Announce on the issue that the flag has been enabled
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
## What does this MR do?
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Please describe why the end-to-end test is being quarantined/ de-quarantined.
|
||||||
|
|
||||||
|
Please note that the aim of quarantining a test is not to get back a green pipeline, but rather to reduce
|
||||||
|
the noise (due to constantly failing tests, flaky tests, and so on) so that new failures are not missed.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
### E2E Test Failure issue(s)
|
||||||
|
|
||||||
|
<!-- Please link to the respective E2E test failure issue. -->
|
||||||
|
|
||||||
|
|
||||||
|
### Check-list
|
||||||
|
|
||||||
|
- [ ] General code guidelines check-list
|
||||||
|
- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)
|
||||||
|
- [ ] [Style guides](https://docs.gitlab.com/ee/development/contributing/style_guides.html)
|
||||||
|
- [ ] Quarantine test check-list
|
||||||
|
- [ ] Follow the [Quarantining Tests guide](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests).
|
||||||
|
- [ ] Confirm the test has a [`quarantine:` tag with the specified quarantine type](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantined-test-types).
|
||||||
|
- [ ] Note if the test should be [quarantined for a specific environment](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/environment_selection.html#quarantining-a-test-for-a-specific-environment).
|
||||||
|
- [ ] Dequarantine test check-list
|
||||||
|
- [ ] Follow the [Dequarantining Tests guide](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#dequarantining-tests).
|
||||||
|
- [ ] Confirm the test consistently passes on the target GitLab environment(s).
|
||||||
|
- [ ] (Optionally) [Trigger a manual GitLab-QA pipeline](https://about.gitlab.com/handbook/engineering/quality/guidelines/tips-and-tricks/#running-gitlab-qa-pipeline-against-a-specific-gitlab-release) against a specific GitLab environment using the `RELEASE` variable from the `package-and-qa` job of the current Merge Request.
|
||||||
|
- [ ] To ensure a faster turnaround, ask in the `#quality` Slack channel for someone to review and merge the merge request, rather than assigning it directly.
|
||||||
|
|
||||||
|
<!-- Base labels. -->
|
||||||
|
/label ~"Quality" ~"QA" ~"feature" ~"feature::maintenance"
|
||||||
|
|
||||||
|
<!-- Labels to pick into auto-deploy. -->
|
||||||
|
/label ~"Pick into auto-deploy" ~"priority::1" ~"severity::1"
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Choose the stage that appears in the test path, e.g. ~"devops::create" for
|
||||||
|
`qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb`.
|
||||||
|
-->
|
||||||
|
/label ~devops::
|
||||||
|
|
||||||
|
<!-- Select the current milestone. -->
|
||||||
|
/milestone %
|
|
@ -1 +1 @@
|
||||||
eb6ecf6f96946849761c1fcdcaf0bda15fc000f9
|
a88ceb12912277ab1e07ca325792df40550e6bcc
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
import { once } from 'lodash';
|
import { once } from 'lodash';
|
||||||
import { deprecatedCreateFlash as flash } from '~/flash';
|
import { deprecatedCreateFlash as flash } from '~/flash';
|
||||||
|
import { darkModeEnabled } from '~/lib/utils/color_utils';
|
||||||
import { __, sprintf } from '~/locale';
|
import { __, sprintf } from '~/locale';
|
||||||
|
|
||||||
// Renders diagrams and flowcharts from text using Mermaid in any element with the
|
// Renders diagrams and flowcharts from text using Mermaid in any element with the
|
||||||
|
@ -27,37 +28,34 @@ let renderedMermaidBlocks = 0;
|
||||||
|
|
||||||
let mermaidModule = {};
|
let mermaidModule = {};
|
||||||
|
|
||||||
|
export function initMermaid(mermaid) {
|
||||||
|
let theme = 'neutral';
|
||||||
|
|
||||||
|
if (darkModeEnabled()) {
|
||||||
|
theme = 'dark';
|
||||||
|
}
|
||||||
|
|
||||||
|
mermaid.initialize({
|
||||||
|
// mermaid core options
|
||||||
|
mermaid: {
|
||||||
|
startOnLoad: false,
|
||||||
|
},
|
||||||
|
// mermaidAPI options
|
||||||
|
theme,
|
||||||
|
flowchart: {
|
||||||
|
useMaxWidth: true,
|
||||||
|
htmlLabels: false,
|
||||||
|
},
|
||||||
|
securityLevel: 'strict',
|
||||||
|
});
|
||||||
|
|
||||||
|
return mermaid;
|
||||||
|
}
|
||||||
|
|
||||||
function importMermaidModule() {
|
function importMermaidModule() {
|
||||||
return import(/* webpackChunkName: 'mermaid' */ 'mermaid')
|
return import(/* webpackChunkName: 'mermaid' */ 'mermaid')
|
||||||
.then((mermaid) => {
|
.then((mermaid) => {
|
||||||
let theme = 'neutral';
|
mermaidModule = initMermaid(mermaid);
|
||||||
const ideDarkThemes = ['dark', 'solarized-dark', 'monokai'];
|
|
||||||
|
|
||||||
if (
|
|
||||||
ideDarkThemes.includes(window.gon?.user_color_scheme) &&
|
|
||||||
// if on the Web IDE page
|
|
||||||
document.querySelector('.ide')
|
|
||||||
) {
|
|
||||||
theme = 'dark';
|
|
||||||
}
|
|
||||||
|
|
||||||
mermaid.initialize({
|
|
||||||
// mermaid core options
|
|
||||||
mermaid: {
|
|
||||||
startOnLoad: false,
|
|
||||||
},
|
|
||||||
// mermaidAPI options
|
|
||||||
theme,
|
|
||||||
flowchart: {
|
|
||||||
useMaxWidth: true,
|
|
||||||
htmlLabels: false,
|
|
||||||
},
|
|
||||||
securityLevel: 'strict',
|
|
||||||
});
|
|
||||||
|
|
||||||
mermaidModule = mermaid;
|
|
||||||
|
|
||||||
return mermaid;
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
flash(sprintf(__("Can't load mermaid module: %{err}"), { err }));
|
flash(sprintf(__("Can't load mermaid module: %{err}"), { err }));
|
||||||
|
|
|
@ -43,3 +43,15 @@ export const validateHexColor = (color = '') => {
|
||||||
|
|
||||||
return /^#([0-9A-F]{3}){1,2}$/i.test(color);
|
return /^#([0-9A-F]{3}){1,2}$/i.test(color);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function darkModeEnabled() {
|
||||||
|
const ideDarkThemes = ['dark', 'solarized-dark', 'monokai'];
|
||||||
|
|
||||||
|
// eslint-disable-next-line @gitlab/require-i18n-strings
|
||||||
|
const isWebIde = document.body.dataset.page.startsWith('ide:');
|
||||||
|
|
||||||
|
if (isWebIde) {
|
||||||
|
return ideDarkThemes.includes(window.gon?.user_color_scheme);
|
||||||
|
}
|
||||||
|
return document.body.classList.contains('gl-dark');
|
||||||
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ module AlertManagement
|
||||||
first_id = project.alert_management_http_integrations
|
first_id = project.alert_management_http_integrations
|
||||||
.ordered_by_id
|
.ordered_by_id
|
||||||
.select(:id)
|
.select(:id)
|
||||||
.at_most(1)
|
.limit(1)
|
||||||
|
|
||||||
@collection = collection.id_in(first_id)
|
@collection = collection.id_in(first_id)
|
||||||
end
|
end
|
||||||
|
|
|
@ -135,6 +135,8 @@ module CommitsHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def cherry_pick_projects_data(project)
|
def cherry_pick_projects_data(project)
|
||||||
|
return [] unless Feature.enabled?(:pick_into_project, project, default_enabled: :yaml)
|
||||||
|
|
||||||
target_projects(project).map do |project|
|
target_projects(project).map do |project|
|
||||||
{
|
{
|
||||||
id: project.id.to_s,
|
id: project.id.to_s,
|
||||||
|
|
|
@ -42,10 +42,6 @@ class ApplicationRecord < ActiveRecord::Base
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.at_most(count)
|
|
||||||
limit(count)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.safe_find_or_create_by!(*args, &block)
|
def self.safe_find_or_create_by!(*args, &block)
|
||||||
safe_find_or_create_by(*args, &block).tap do |record|
|
safe_find_or_create_by(*args, &block).tap do |record|
|
||||||
raise ActiveRecord::RecordNotFound unless record.present?
|
raise ActiveRecord::RecordNotFound unless record.present?
|
||||||
|
|
|
@ -17,7 +17,7 @@ module MergeRequests
|
||||||
.opened
|
.opened
|
||||||
.by_target_branch(merge_request.source_branch)
|
.by_target_branch(merge_request.source_branch)
|
||||||
.preload_source_project
|
.preload_source_project
|
||||||
.at_most(MAX_RETARGET_MERGE_REQUESTS)
|
.limit(MAX_RETARGET_MERGE_REQUESTS)
|
||||||
|
|
||||||
other_merge_requests.find_each do |other_merge_request|
|
other_merge_requests.find_each do |other_merge_request|
|
||||||
# Update only MRs on projects that we have access to
|
# Update only MRs on projects that we have access to
|
||||||
|
|
|
@ -16,4 +16,4 @@
|
||||||
= render "shared/import_form", f: f
|
= render "shared/import_form", f: f
|
||||||
|
|
||||||
.form-actions
|
.form-actions
|
||||||
= f.submit 'Start import', class: "gl-button btn btn-success"
|
= f.submit 'Start import', class: "gl-button btn btn-confirm"
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Move from btn-success to btn-confirm in imports directory
|
||||||
|
merge_request: 56336
|
||||||
|
author: Yogi (@yo)
|
||||||
|
type: changed
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Fix mermaid diagrams in dark mode
|
||||||
|
merge_request: 56183
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
||||||
|
|
||||||
# Migration to Vue 3
|
# Migration to Vue 3
|
||||||
|
|
||||||
|
Preparations for a Vue 3 migration are tracked in epic [&3174](https://gitlab.com/groups/gitlab-org/-/epics/3174)
|
||||||
|
|
||||||
In order to prepare for the eventual migration to Vue 3.x, we should be wary about adding the following features to the codebase:
|
In order to prepare for the eventual migration to Vue 3.x, we should be wary about adding the following features to the codebase:
|
||||||
|
|
||||||
## Vue filters
|
## Vue filters
|
||||||
|
|
|
@ -9836,6 +9836,78 @@ Status: `implemented`
|
||||||
|
|
||||||
Tiers: `premium`, `ultimate`
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
|
### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_fixed_monthly`
|
||||||
|
|
||||||
|
Counts of MAU setting epic start date as fixed
|
||||||
|
|
||||||
|
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210315055624_g_project_management_users_setting_epic_start_date_as_fixed_monthly.yml)
|
||||||
|
|
||||||
|
Group: `group:product planning`
|
||||||
|
|
||||||
|
Status: `implemented`
|
||||||
|
|
||||||
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
|
### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_fixed_weekly`
|
||||||
|
|
||||||
|
Counts of WAU setting epic start date as fixed
|
||||||
|
|
||||||
|
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210315054905_g_project_management_users_setting_epic_start_date_as_fixed_weekly.yml)
|
||||||
|
|
||||||
|
Group: `group:product planning`
|
||||||
|
|
||||||
|
Status: `implemented`
|
||||||
|
|
||||||
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
|
### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_inherited_monthly`
|
||||||
|
|
||||||
|
Counts of MAU setting epic start date as inherited
|
||||||
|
|
||||||
|
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210315055439_g_project_management_users_setting_epic_start_date_as_inherited_monthly.yml)
|
||||||
|
|
||||||
|
Group: `group:product planning`
|
||||||
|
|
||||||
|
Status: `implemented`
|
||||||
|
|
||||||
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
|
### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_inherited_weekly`
|
||||||
|
|
||||||
|
Counts of WAU setting epic start date as inherited
|
||||||
|
|
||||||
|
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210315055342_g_project_management_users_setting_epic_start_date_as_inherited_weekly.yml)
|
||||||
|
|
||||||
|
Group: `group:product planning`
|
||||||
|
|
||||||
|
Status: `implemented`
|
||||||
|
|
||||||
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
|
### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_notes_monthly`
|
||||||
|
|
||||||
|
Counts of MAU updating epic notes
|
||||||
|
|
||||||
|
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210314234202_g_project_management_users_updating_epic_notes_monthly.yml)
|
||||||
|
|
||||||
|
Group: `group:product planning`
|
||||||
|
|
||||||
|
Status: `implemented`
|
||||||
|
|
||||||
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
|
### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_notes_weekly`
|
||||||
|
|
||||||
|
Counts of WAU updating epic notes
|
||||||
|
|
||||||
|
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210314234041_g_project_management_users_updating_epic_notes_weekly.yml)
|
||||||
|
|
||||||
|
Group: `group:product planning`
|
||||||
|
|
||||||
|
Status: `implemented`
|
||||||
|
|
||||||
|
Tiers: `premium`, `ultimate`
|
||||||
|
|
||||||
### `redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`
|
### `redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`
|
||||||
|
|
||||||
Missing description
|
Missing description
|
||||||
|
|
|
@ -32,7 +32,7 @@ pre-push:
|
||||||
tags: backend style
|
tags: backend style
|
||||||
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
||||||
glob: '*.rb'
|
glob: '*.rb'
|
||||||
run: bundle exec rubocop --parallel --force-exclusion {files}
|
run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
|
||||||
vale: # Requires Vale: https://docs.gitlab.com/ee/development/documentation/#install-linters
|
vale: # Requires Vale: https://docs.gitlab.com/ee/development/documentation/#install-linters
|
||||||
tags: documentation style
|
tags: documentation style
|
||||||
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
|
||||||
|
|
|
@ -38,7 +38,7 @@ module Gitlab
|
||||||
|
|
||||||
def fetch_page(relation)
|
def fetch_page(relation)
|
||||||
relation = relation.by_updated_at
|
relation = relation.by_updated_at
|
||||||
notes = relation.at_most(LIMIT + 1).to_a
|
notes = relation.limit(LIMIT + 1).to_a
|
||||||
|
|
||||||
return [notes, false] unless notes.size > LIMIT
|
return [notes, false] unless notes.size > LIMIT
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,26 @@
|
||||||
aggregation: daily
|
aggregation: daily
|
||||||
feature_flag: track_epics_activity
|
feature_flag: track_epics_activity
|
||||||
|
|
||||||
|
- name: g_project_management_users_updating_epic_notes
|
||||||
|
category: epics_usage
|
||||||
|
redis_slot: project_management
|
||||||
|
aggregation: daily
|
||||||
|
feature_flag: track_epics_activity
|
||||||
|
|
||||||
- name: g_project_management_users_destroying_epic_notes
|
- name: g_project_management_users_destroying_epic_notes
|
||||||
category: epics_usage
|
category: epics_usage
|
||||||
redis_slot: project_management
|
redis_slot: project_management
|
||||||
aggregation: daily
|
aggregation: daily
|
||||||
feature_flag: track_epics_activity
|
feature_flag: track_epics_activity
|
||||||
|
|
||||||
|
- name: g_project_management_users_setting_epic_start_date_as_fixed
|
||||||
|
category: epics_usage
|
||||||
|
redis_slot: project_management
|
||||||
|
aggregation: daily
|
||||||
|
feature_flag: track_epics_activity
|
||||||
|
|
||||||
|
- name: g_project_management_users_setting_epic_start_date_as_inherited
|
||||||
|
category: epics_usage
|
||||||
|
redis_slot: project_management
|
||||||
|
aggregation: daily
|
||||||
|
feature_flag: track_epics_activity
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { initMermaid } from '~/behaviors/markdown/render_mermaid';
|
||||||
|
import * as ColorUtils from '~/lib/utils/color_utils';
|
||||||
|
|
||||||
|
describe('Render mermaid diagrams for Gitlab Flavoured Markdown', () => {
|
||||||
|
it.each`
|
||||||
|
darkMode | expectedTheme
|
||||||
|
${false} | ${'neutral'}
|
||||||
|
${true} | ${'dark'}
|
||||||
|
`('is $darkMode $expectedTheme', async ({ darkMode, expectedTheme }) => {
|
||||||
|
jest.spyOn(ColorUtils, 'darkModeEnabled').mockImplementation(() => darkMode);
|
||||||
|
|
||||||
|
const mermaid = {
|
||||||
|
initialize: jest.fn(),
|
||||||
|
};
|
||||||
|
|
||||||
|
await initMermaid(mermaid);
|
||||||
|
|
||||||
|
expect(mermaid.initialize).toHaveBeenCalledTimes(1);
|
||||||
|
expect(mermaid.initialize).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
theme: expectedTheme,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,4 +1,9 @@
|
||||||
import { textColorForBackground, hexToRgb, validateHexColor } from '~/lib/utils/color_utils';
|
import {
|
||||||
|
textColorForBackground,
|
||||||
|
hexToRgb,
|
||||||
|
validateHexColor,
|
||||||
|
darkModeEnabled,
|
||||||
|
} from '~/lib/utils/color_utils';
|
||||||
|
|
||||||
describe('Color utils', () => {
|
describe('Color utils', () => {
|
||||||
describe('Converting hex code to rgb', () => {
|
describe('Converting hex code to rgb', () => {
|
||||||
|
@ -47,4 +52,24 @@ describe('Color utils', () => {
|
||||||
expect(validateHexColor(color)).toEqual(output);
|
expect(validateHexColor(color)).toEqual(output);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('darkModeEnabled', () => {
|
||||||
|
it.each`
|
||||||
|
page | bodyClass | ideTheme | expected
|
||||||
|
${'ide:index'} | ${'gl-dark'} | ${'monokai-light'} | ${false}
|
||||||
|
${'ide:index'} | ${'ui-light'} | ${'monokai'} | ${true}
|
||||||
|
${'groups:issues:index'} | ${'ui-light'} | ${'monokai'} | ${false}
|
||||||
|
${'groups:issues:index'} | ${'gl-dark'} | ${'monokai-light'} | ${true}
|
||||||
|
`(
|
||||||
|
'is $expected on $page with $bodyClass body class and $ideTheme IDE theme',
|
||||||
|
async ({ page, bodyClass, ideTheme, expected }) => {
|
||||||
|
document.body.outerHTML = `<body class="${bodyClass}" data-page="${page}"></body>`;
|
||||||
|
window.gon = {
|
||||||
|
user_color_scheme: ideTheme,
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(darkModeEnabled()).toBe(expected);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -257,5 +257,15 @@ RSpec.describe CommitsHelper do
|
||||||
{ id: forked_project.id.to_s, name: forked_project.full_path, refsUrl: refs_project_path(forked_project) }
|
{ id: forked_project.id.to_s, name: forked_project.full_path, refsUrl: refs_project_path(forked_project) }
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'pick_into_project is disabled' do
|
||||||
|
before do
|
||||||
|
stub_feature_flags(pick_into_project: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not calculate target projects' do
|
||||||
|
expect(helper.cherry_pick_projects_data(project)).to eq([])
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -93,13 +93,6 @@ RSpec.describe ApplicationRecord do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '.at_most' do
|
|
||||||
it 'limits the number of records returned' do
|
|
||||||
create_list(:user, 3)
|
|
||||||
expect(User.at_most(2).count).to eq(2)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '.where_exists' do
|
describe '.where_exists' do
|
||||||
it 'produces a WHERE EXISTS query' do
|
it 'produces a WHERE EXISTS query' do
|
||||||
user = create(:user)
|
user = create(:user)
|
||||||
|
|
Loading…
Reference in New Issue