Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Gemfile6
-rw-r--r--Gemfile.checksum6
-rw-r--r--Gemfile.lock14
-rw-r--r--app/assets/javascripts/ci/job_details/components/job_log_controllers.vue45
-rw-r--r--app/assets/javascripts/ci/job_details/components/log/log.vue4
-rw-r--r--app/assets/javascripts/ci/job_details/index.js9
-rw-r--r--app/assets/javascripts/ci/job_details/job_app.vue8
-rw-r--r--app/assets/javascripts/ci/job_details/store/actions.js74
-rw-r--r--app/assets/javascripts/ci/job_details/store/getters.js3
-rw-r--r--app/assets/javascripts/ci/job_details/store/mutation_types.js5
-rw-r--r--app/assets/javascripts/ci/job_details/store/mutations.js13
-rw-r--r--app/assets/javascripts/ci/job_details/store/state.js6
-rw-r--r--app/assets/stylesheets/page_bundles/build.scss8
-rw-r--r--config/feature_flags/development/cache_autocomplete_sources_commands.yml2
-rw-r--r--config/feature_flags/development/cache_autocomplete_sources_labels.yml2
-rw-r--r--doc/ci/jobs/index.md8
-rw-r--r--doc/development/documentation/styleguide/word_list.md21
-rw-r--r--doc/development/testing_guide/flaky_tests.md11
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md113
-rw-r--r--lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml2
-rw-r--r--locale/gitlab.pot9
-rw-r--r--qa/gdk/Dockerfile.gdk2
-rw-r--r--spec/frontend/ci/job_details/components/job_log_controllers_spec.js53
-rw-r--r--spec/frontend/ci/job_details/components/log/log_spec.js1
-rw-r--r--spec/frontend/ci/job_details/store/actions_spec.js40
-rw-r--r--spec/frontend/ci/job_details/store/mutations_spec.js30
28 files changed, 435 insertions, 64 deletions
diff --git a/Gemfile b/Gemfile
index 3b6019c55db..1dff5c15b83 100644
--- a/Gemfile
+++ b/Gemfile
@@ -495,7 +495,7 @@ group :test do
gem 'capybara', '~> 3.39', '>= 3.39.2' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'capybara-screenshot', '~> 1.0.26' # rubocop:todo Gemfile/MissingFeatureCategory
- gem 'selenium-webdriver', '~> 4.15' # rubocop:todo Gemfile/MissingFeatureCategory
+ gem 'selenium-webdriver', '~> 4.16' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'graphlyte', '~> 1.0.0' # rubocop:todo Gemfile/MissingFeatureCategory
@@ -512,12 +512,12 @@ group :test do
# Moved in `test` because https://gitlab.com/gitlab-org/gitlab/-/issues/217527
gem 'derailed_benchmarks', require: false # rubocop:todo Gemfile/MissingFeatureCategory
- gem 'gitlab_quality-test_tooling', '~> 1.7.0', require: false, feature_category: :tooling
+ gem 'gitlab_quality-test_tooling', '~> 1.9.0', require: false, feature_category: :tooling
end
gem 'octokit', '~> 6.0' # rubocop:todo Gemfile/MissingFeatureCategory
-gem 'gitlab-mail_room', '~> 0.0.23', require: 'mail_room' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 'gitlab-mail_room', '~> 0.0.24', require: 'mail_room', feature_category: :shared
gem 'email_reply_trimmer', '~> 0.1' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'html2text' # rubocop:todo Gemfile/MissingFeatureCategory
diff --git a/Gemfile.checksum b/Gemfile.checksum
index 58a85942d90..4a39309d863 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -214,14 +214,14 @@
{"name":"gitlab-fog-azure-rm","version":"1.8.0","platform":"ruby","checksum":"e4f24b174b273b88849d12fbcfecb79ae1c09f56cbd614998714c7f0a81e6c28"},
{"name":"gitlab-labkit","version":"0.34.0","platform":"ruby","checksum":"ca5c504201390cd07ba1029e6ca3059f4e2e6005eb121ba8a103af1e166a3ecd"},
{"name":"gitlab-license","version":"2.3.0","platform":"ruby","checksum":"60cae3871c46607dde58994faf761c6755adc61133a92e5ab59ab26a8b9b4157"},
-{"name":"gitlab-mail_room","version":"0.0.23","platform":"ruby","checksum":"23564fa4dab24ec5011d4c64a801fc0228301d5b0f046a26a1d8e96e36c19997"},
+{"name":"gitlab-mail_room","version":"0.0.24","platform":"ruby","checksum":"c7bf3df73dbcc024bc98dbf72514520ac2ff2b6d0124de496279fe56c13c3cb3"},
{"name":"gitlab-markup","version":"1.9.0","platform":"ruby","checksum":"7eda045a08ec2d110084252fa13a8c9eac8bdac0e302035ca7db4b82bcbd7ed4"},
{"name":"gitlab-net-dns","version":"0.9.2","platform":"ruby","checksum":"f726d978479d43810819f12a45c0906d775a07e34df111bbe693fffbbef3059d"},
{"name":"gitlab-sdk","version":"0.2.3","platform":"ruby","checksum":"e891278a20860ab1f861312813dce5f2e73081bcc10def2ae4ee138b10a2d0d6"},
{"name":"gitlab-styles","version":"11.0.0","platform":"ruby","checksum":"0dd8ec066ce9955ac51d3616c6bfded30f75bb526f39ff392ece6f43d5b9406b"},
{"name":"gitlab_chronic_duration","version":"0.12.0","platform":"ruby","checksum":"0d766944d415b5c831f176871ee8625783fc0c5bfbef2d79a3a616f207ffc16d"},
{"name":"gitlab_omniauth-ldap","version":"2.2.0","platform":"ruby","checksum":"bb4d20acb3b123ed654a8f6a47d3fac673ece7ed0b6992edb92dca14bad2838c"},
-{"name":"gitlab_quality-test_tooling","version":"1.7.0","platform":"ruby","checksum":"41c6ab424a50215635671156738fb619f02c15c87c6f0c9f81e9b785fb583962"},
+{"name":"gitlab_quality-test_tooling","version":"1.9.0","platform":"ruby","checksum":"0d47a72282e8e4d3dfc3094fe8eb2309a37c583570739a04e26afe38cd2da3a2"},
{"name":"globalid","version":"1.1.0","platform":"ruby","checksum":"b337e1746f0c8cb0a6c918234b03a1ddeb4966206ce288fbb57779f59b2d154f"},
{"name":"gon","version":"6.4.0","platform":"ruby","checksum":"e3a618d659392890f1aa7db420f17c75fd7d35aeb5f8fe003697d02c4b88d2f0"},
{"name":"google-apis-androidpublisher_v3","version":"0.34.0","platform":"ruby","checksum":"d7e1d7dd92f79c498fe2082222a1740d788e022e660c135564b3fd299cab5425"},
@@ -579,7 +579,7 @@
{"name":"sawyer","version":"0.9.2","platform":"ruby","checksum":"fa3a72d62a4525517b18857ddb78926aab3424de0129be6772a8e2ba240e7aca"},
{"name":"sd_notify","version":"0.1.1","platform":"ruby","checksum":"cbc7ac6caa7cedd26b30a72b5eeb6f36050dc0752df263452ea24fb5a4ad3131"},
{"name":"seed-fu","version":"2.3.7","platform":"ruby","checksum":"f19673443e9af799b730e3d4eca6a89b39e5a36825015dffd00d02ea3365cf74"},
-{"name":"selenium-webdriver","version":"4.15.0","platform":"ruby","checksum":"36134e883c4df98f1b7e8519a3753c77427b74621147f8245aa6cac306d52297"},
+{"name":"selenium-webdriver","version":"4.16.0","platform":"ruby","checksum":"237013649ea52435fe386cf4069b56d3f64c127b05af5f4d5c059bd71ee4c3e3"},
{"name":"semver_dialects","version":"1.5.0","platform":"ruby","checksum":"0080f1abafc9c1af82d34e890d7c317b9eacb56b9e03040107ef5d1a51ca49ae"},
{"name":"sentry-rails","version":"5.10.0","platform":"ruby","checksum":"99aa2fac136c26942eb1897c65de65dac88ad43ac5eb183ff20711287a137ebd"},
{"name":"sentry-raven","version":"3.1.2","platform":"ruby","checksum":"103d3b122958810d34898ce2e705bcf549ddb9d855a70ce9a3970ee2484f364a"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 3ffb5f89065..f347caac339 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -695,10 +695,12 @@ GEM
pg_query (~> 4.2.3)
redis (> 3.0.0, < 6.0.0)
gitlab-license (2.3.0)
- gitlab-mail_room (0.0.23)
+ gitlab-mail_room (0.0.24)
jwt (>= 2.0)
net-imap (>= 0.2.1)
oauth2 (>= 1.4.4, < 3)
+ redis (>= 4, < 6)
+ redis-namespace (>= 1.8.2)
gitlab-markup (1.9.0)
gitlab-net-dns (0.9.2)
gitlab-sdk (0.2.3)
@@ -718,7 +720,7 @@ GEM
omniauth (>= 1.3, < 3)
pyu-ruby-sasl (>= 0.0.3.3, < 0.1)
rubyntlm (~> 0.5)
- gitlab_quality-test_tooling (1.7.0)
+ gitlab_quality-test_tooling (1.9.0)
activesupport (>= 6.1, < 7.2)
amatch (~> 0.4.1)
gitlab (~> 4.19)
@@ -1509,7 +1511,7 @@ GEM
seed-fu (2.3.7)
activerecord (>= 3.1)
activesupport (>= 3.1)
- selenium-webdriver (4.15.0)
+ selenium-webdriver (4.16.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
@@ -1878,7 +1880,7 @@ DEPENDENCIES
gitlab-http!
gitlab-labkit (~> 0.34.0)
gitlab-license (~> 2.3)
- gitlab-mail_room (~> 0.0.23)
+ gitlab-mail_room (~> 0.0.24)
gitlab-markup (~> 1.9.0)
gitlab-net-dns (~> 0.9.2)
gitlab-rspec!
@@ -1891,7 +1893,7 @@ DEPENDENCIES
gitlab-utils!
gitlab_chronic_duration (~> 0.12)
gitlab_omniauth-ldap (~> 2.2.0)
- gitlab_quality-test_tooling (~> 1.7.0)
+ gitlab_quality-test_tooling (~> 1.9.0)
gon (~> 6.4.0)
google-apis-androidpublisher_v3 (~> 0.34.0)
google-apis-cloudbilling_v1 (~> 0.21.0)
@@ -2053,7 +2055,7 @@ DEPENDENCIES
sassc-rails (~> 2.1.0)
sd_notify (~> 0.1.0)
seed-fu (~> 2.3.7)
- selenium-webdriver (~> 4.15)
+ selenium-webdriver (~> 4.16)
semver_dialects (~> 1.5)
sentry-rails (~> 5.10.0)
sentry-raven (~> 3.1)
diff --git a/app/assets/javascripts/ci/job_details/components/job_log_controllers.vue b/app/assets/javascripts/ci/job_details/components/job_log_controllers.vue
index a22ed8f599b..837efa154e2 100644
--- a/app/assets/javascripts/ci/job_details/components/job_log_controllers.vue
+++ b/app/assets/javascripts/ci/job_details/components/job_log_controllers.vue
@@ -20,6 +20,9 @@ export default {
'Job|Search for substrings in your job log output. Currently search is only supported for the visible job log output, not for any log output that is truncated due to size.',
),
logLineNumberNotFound: s__('Job|We could not find this element'),
+ enterFullscreen: s__('Job|Show full screen'),
+ exitFullScreen: s__('Job|Exit full screen'),
+ fullScreenNotAvailable: s__('Job|Full screen mode is not available'),
},
components: {
GlLink,
@@ -65,6 +68,16 @@ export default {
type: Array,
required: true,
},
+ fullScreenModeAvailable: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ fullScreenEnabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -86,6 +99,9 @@ export default {
shouldDisableJumpToFailures() {
return !this.hasFailures;
},
+ fullScreenTooltipContent() {
+ return this.fullScreenModeAvailable ? '' : this.$options.i18n.fullScreenNotAvailable;
+ },
},
mounted() {
this.checkFailureCount();
@@ -121,6 +137,12 @@ export default {
this.$emit('scrollJobLogBottom');
this.failureIndex = 0;
},
+ handleFullscreenMode() {
+ this.$emit('enterFullscreen');
+ },
+ handleExitFullscreenMode() {
+ this.$emit('exitFullscreen');
+ },
searchJobLog() {
this.searchResults = [];
@@ -249,6 +271,29 @@ export default {
/>
</div>
<!-- eo scroll buttons -->
+
+ <div v-gl-tooltip="fullScreenTooltipContent">
+ <gl-button
+ v-if="!fullScreenEnabled"
+ :disabled="!fullScreenModeAvailable"
+ :title="$options.i18n.enterFullscreen"
+ :aria-label="$options.i18n.enterFullscreen"
+ class="btn-scroll gl-ml-3"
+ data-testid="job-controller-enter-fullscreen"
+ icon="maximize"
+ @click="handleFullscreenMode"
+ />
+ </div>
+
+ <gl-button
+ v-if="fullScreenEnabled"
+ :title="$options.i18n.exitFullScreen"
+ :aria-label="$options.i18n.exitFullScreen"
+ class="btn-scroll gl-ml-3"
+ data-testid="job-controller-exit-fullscreen"
+ icon="minimize"
+ @click="handleExitFullscreenMode"
+ />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/ci/job_details/components/log/log.vue b/app/assets/javascripts/ci/job_details/components/log/log.vue
index 8b43739d7ef..8ca9515996c 100644
--- a/app/assets/javascripts/ci/job_details/components/log/log.vue
+++ b/app/assets/javascripts/ci/job_details/components/log/log.vue
@@ -40,9 +40,11 @@ export default {
}
});
}
+
+ this.setupFullScreenListeners();
},
methods: {
- ...mapActions(['toggleCollapsibleLine', 'scrollBottom']),
+ ...mapActions(['toggleCollapsibleLine', 'scrollBottom', 'setupFullScreenListeners']),
handleOnClickCollapsibleLine(section) {
this.toggleCollapsibleLine(section);
},
diff --git a/app/assets/javascripts/ci/job_details/index.js b/app/assets/javascripts/ci/job_details/index.js
index 7748b6e83ef..9aa01c4686e 100644
--- a/app/assets/javascripts/ci/job_details/index.js
+++ b/app/assets/javascripts/ci/job_details/index.js
@@ -34,9 +34,16 @@ export const initJobDetails = () => {
pipelineTestReportUrl,
} = el.dataset;
+ const fullScreenAPIAvailable = document.fullscreenEnabled;
+
// init store to start fetching log
const store = createStore();
- store.dispatch('init', { jobEndpoint, logEndpoint, testReportSummaryUrl });
+ store.dispatch('init', {
+ jobEndpoint,
+ logEndpoint,
+ testReportSummaryUrl,
+ fullScreenAPIAvailable,
+ });
return new Vue({
el,
diff --git a/app/assets/javascripts/ci/job_details/job_app.vue b/app/assets/javascripts/ci/job_details/job_app.vue
index 491cd1d35b9..c2394aa4fac 100644
--- a/app/assets/javascripts/ci/job_details/job_app.vue
+++ b/app/assets/javascripts/ci/job_details/job_app.vue
@@ -81,6 +81,7 @@ export default {
'isScrollTopDisabled',
'hasError',
'selectedStage',
+ 'fullScreenEnabled',
]),
...mapGetters([
'headerTime',
@@ -94,6 +95,7 @@ export default {
'isScrollingDown',
'emptyStateAction',
'hasOfflineRunnersForProject',
+ 'fullScreenAPIAndContainerAvailable',
]),
shouldRenderContent() {
@@ -172,6 +174,8 @@ export default {
'stopPolling',
'toggleScrollButtons',
'toggleScrollAnimation',
+ 'enterFullscreen',
+ 'exitFullscreen',
]),
onHideManualVariablesForm() {
this.showUpdateVariablesState = false;
@@ -292,9 +296,13 @@ export default {
:is-scrolling-down="isScrollingDown"
:is-complete="isJobLogComplete"
:job-log="jobLog"
+ :full-screen-mode-available="fullScreenAPIAndContainerAvailable"
+ :full-screen-enabled="fullScreenEnabled"
@scrollJobLogTop="scrollTop"
@scrollJobLogBottom="scrollBottom"
@searchResults="setSearchResults"
+ @enterFullscreen="enterFullscreen"
+ @exitFullscreen="exitFullscreen"
/>
<log :search-results="searchResults" />
</div>
diff --git a/app/assets/javascripts/ci/job_details/store/actions.js b/app/assets/javascripts/ci/job_details/store/actions.js
index 03323e51583..e1225ecd2c9 100644
--- a/app/assets/javascripts/ci/job_details/store/actions.js
+++ b/app/assets/javascripts/ci/job_details/store/actions.js
@@ -15,8 +15,16 @@ import { __ } from '~/locale';
import { reportToSentry } from '~/ci/utils';
import * as types from './mutation_types';
-export const init = ({ commit, dispatch }, { jobEndpoint, logEndpoint, testReportSummaryUrl }) => {
- commit(types.SET_JOB_LOG_OPTIONS, { jobEndpoint, logEndpoint, testReportSummaryUrl });
+export const init = (
+ { commit, dispatch },
+ { jobEndpoint, logEndpoint, testReportSummaryUrl, fullScreenAPIAvailable = false },
+) => {
+ commit(types.SET_JOB_LOG_OPTIONS, {
+ jobEndpoint,
+ logEndpoint,
+ testReportSummaryUrl,
+ fullScreenAPIAvailable,
+ });
return dispatch('fetchJob');
};
@@ -24,6 +32,68 @@ export const init = ({ commit, dispatch }, { jobEndpoint, logEndpoint, testRepor
export const hideSidebar = ({ commit }) => commit(types.HIDE_SIDEBAR);
export const showSidebar = ({ commit }) => commit(types.SHOW_SIDEBAR);
+export const enterFullscreen = ({ dispatch }) => {
+ const el = document.querySelector('.build-log-container');
+
+ if (!document.fullscreenElement && el) {
+ el.requestFullscreen()
+ .then(() => {
+ dispatch('enterFullscreenSuccess');
+ })
+ .catch((err) => {
+ reportToSentry('job_enter_fullscreen_mode', err);
+ });
+ }
+};
+
+export const enterFullscreenSuccess = ({ commit }) => {
+ commit(types.ENTER_FULLSCREEN_SUCCESS);
+};
+
+export const exitFullscreen = ({ dispatch }) => {
+ if (document.fullscreenElement) {
+ document
+ .exitFullscreen()
+ .then(() => {
+ dispatch('exitFullscreenSuccess');
+ })
+ .catch((err) => {
+ reportToSentry('job_exit_fullscreen_mode', err);
+ });
+ }
+};
+
+export const exitFullscreenSuccess = ({ commit }) => {
+ commit(types.EXIT_FULLSCREEN_SUCCESS);
+};
+
+export const fullScreenContainerSetUpResult = ({ commit }, value) => {
+ commit(types.FULL_SCREEN_CONTAINER_SET_UP, value);
+};
+
+export const fullScreenModeAvailableSuccess = ({ commit }) => {
+ commit(types.FULL_SCREEN_MODE_AVAILABLE_SUCCESS);
+};
+
+export const setupFullScreenListeners = ({ dispatch, state, getters }) => {
+ if (!state.fullScreenContainerSetUp && getters.hasJobLog) {
+ const el = document.querySelector('.build-log-container');
+
+ if (el) {
+ dispatch('fullScreenModeAvailableSuccess');
+
+ el.addEventListener('fullscreenchange', () => {
+ if (!document.fullscreenElement) {
+ // Leaving fullscreen mode
+ dispatch('exitFullscreenSuccess');
+ }
+ });
+
+ dispatch('fullScreenContainerSetUpResult', true);
+ }
+ }
+};
+
export const toggleSidebar = ({ dispatch, state }) => {
if (state.isSidebarOpen) {
dispatch('hideSidebar');
diff --git a/app/assets/javascripts/ci/job_details/store/getters.js b/app/assets/javascripts/ci/job_details/store/getters.js
index a0f9db7409d..db967da87fb 100644
--- a/app/assets/javascripts/ci/job_details/store/getters.js
+++ b/app/assets/javascripts/ci/job_details/store/getters.js
@@ -48,3 +48,6 @@ export const isScrollingDown = (state) => isScrolledToBottom() && !state.isJobLo
export const hasOfflineRunnersForProject = (state) =>
state?.job?.runners?.available && !state?.job?.runners?.online;
+
+export const fullScreenAPIAndContainerAvailable = (state) =>
+ state.fullScreenAPIAvailable && state.fullScreenModeAvailable;
diff --git a/app/assets/javascripts/ci/job_details/store/mutation_types.js b/app/assets/javascripts/ci/job_details/store/mutation_types.js
index 1feb35c51d8..382bee9059f 100644
--- a/app/assets/javascripts/ci/job_details/store/mutation_types.js
+++ b/app/assets/javascripts/ci/job_details/store/mutation_types.js
@@ -29,3 +29,8 @@ export const RECEIVE_JOBS_FOR_STAGE_ERROR = 'RECEIVE_JOBS_FOR_STAGE_ERROR';
export const RECEIVE_TEST_SUMMARY_SUCCESS = 'RECEIVE_TEST_SUMMARY_SUCCESS';
export const RECEIVE_TEST_SUMMARY_COMPLETE = 'RECEIVE_TEST_SUMMARY_COMPLETE';
+
+export const ENTER_FULLSCREEN_SUCCESS = 'ENTER_FULLSCREEN_SUCCESS';
+export const EXIT_FULLSCREEN_SUCCESS = 'EXIT_FULLSCREEN_SUCCESS';
+export const FULL_SCREEN_CONTAINER_SET_UP = 'FULL_SCREEN_CONTAINER_SET_UP';
+export const FULL_SCREEN_MODE_AVAILABLE_SUCCESS = 'FULL_SCREEN_MODE_AVAILABLE_SUCCESS';
diff --git a/app/assets/javascripts/ci/job_details/store/mutations.js b/app/assets/javascripts/ci/job_details/store/mutations.js
index e8e65d690d8..866ce48ce9f 100644
--- a/app/assets/javascripts/ci/job_details/store/mutations.js
+++ b/app/assets/javascripts/ci/job_details/store/mutations.js
@@ -6,6 +6,7 @@ export default {
state.jobEndpoint = options.jobEndpoint;
state.logEndpoint = options.logEndpoint;
state.testReportSummaryUrl = options.testReportSummaryUrl;
+ state.fullScreenAPIAvailable = options.fullScreenAPIAvailable;
},
[types.HIDE_SIDEBAR](state) {
@@ -142,4 +143,16 @@ export default {
[types.RECEIVE_TEST_SUMMARY_COMPLETE](state) {
state.testSummaryComplete = true;
},
+ [types.ENTER_FULLSCREEN_SUCCESS](state) {
+ state.fullScreenEnabled = true;
+ },
+ [types.EXIT_FULLSCREEN_SUCCESS](state) {
+ state.fullScreenEnabled = false;
+ },
+ [types.FULL_SCREEN_CONTAINER_SET_UP](state, value) {
+ state.fullScreenContainerSetUp = value;
+ },
+ [types.FULL_SCREEN_MODE_AVAILABLE_SUCCESS](state) {
+ state.fullScreenModeAvailable = true;
+ },
};
diff --git a/app/assets/javascripts/ci/job_details/store/state.js b/app/assets/javascripts/ci/job_details/store/state.js
index 24736bedf56..a3c1e7692c3 100644
--- a/app/assets/javascripts/ci/job_details/store/state.js
+++ b/app/assets/javascripts/ci/job_details/store/state.js
@@ -16,6 +16,12 @@ export default () => ({
isScrollBottomDisabled: true,
isScrollTopDisabled: true,
+ // fullscreen mode
+ fullScreenAPIAvailable: false,
+ fullScreenModeAvailable: false,
+ fullScreenEnabled: false,
+ fullScreenContainerSetUp: false,
+
jobLog: [],
jobLogSections: {},
isJobLogComplete: false,
diff --git a/app/assets/stylesheets/page_bundles/build.scss b/app/assets/stylesheets/page_bundles/build.scss
index 37014292925..379f1470b20 100644
--- a/app/assets/stylesheets/page_bundles/build.scss
+++ b/app/assets/stylesheets/page_bundles/build.scss
@@ -179,6 +179,14 @@
background-color: $builds-log-bg;
}
+.build-log-container:fullscreen {
+ overflow-y: scroll;
+
+ .top-bar {
+ top: 0 !important;
+ }
+}
+
.job-log-line {
padding: 1px $gl-padding-8 1px $job-log-line-padding;
min-height: $gl-line-height-20;
diff --git a/config/feature_flags/development/cache_autocomplete_sources_commands.yml b/config/feature_flags/development/cache_autocomplete_sources_commands.yml
index c4cf6d19d48..ed3e9a8b35a 100644
--- a/config/feature_flags/development/cache_autocomplete_sources_commands.yml
+++ b/config/feature_flags/development/cache_autocomplete_sources_commands.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/433168
milestone: '16.7'
type: development
group: group::global search
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/cache_autocomplete_sources_labels.yml b/config/feature_flags/development/cache_autocomplete_sources_labels.yml
index 238e35ab8b9..fe1e3ffc86c 100644
--- a/config/feature_flags/development/cache_autocomplete_sources_labels.yml
+++ b/config/feature_flags/development/cache_autocomplete_sources_labels.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/433170
milestone: '16.7'
type: development
group: group::global search
-default_enabled: false
+default_enabled: true
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index e8ab5cbfdcd..f4836f93234 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -375,6 +375,14 @@ job1:
- echo -e "\e[0Ksection_end:`date +%s`:my_first_section\r\e[0K"
```
+### Full screen mode
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363617) in GitLab 16.7.
+
+You can view the contents of a job log in full screen mode by clicking **Show full screen**.
+
+To use full screen mode, your web browser must also support it. If your web browser does not support full screen mode, then the option is not available.
+
## Deployment jobs
Deployment jobs are a specific kind of CI job in that they deploy code to
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index f4fdab99307..913683c936d 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -1436,6 +1436,17 @@ Do not use **Reporter permissions**. A user who is assigned the Reporter role ha
Use title case for **Repository Mirroring**.
+## resolution, resolve
+
+Use **resolution** when the troubleshooting solution fixes the issue permanently.
+A resolution usually involves file and code changes to correct the problem.
+For example:
+
+- To resolve this issue, update the `.gitlab-ci.yml` file.
+- One resolution is to update the `.gitlab-ci.yml` file.
+
+See also [workaround](#workaround).
+
## requirements
When documenting the tasks that must be completed or the conditions that must be met before a user can complete the steps:
@@ -1911,6 +1922,16 @@ Instead of:
([Vale](../testing.md#vale) rule: [`SubstitutionSuggestions.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/SubstitutionSuggestions.yml))
+## workaround
+
+Use **workaround** when the troubleshooting solution is a temporary fix.
+A workaround is usually an immediate fix and might have ongoing issues.
+For example:
+
+- The workaround is to temporarily pin your template to the deprecated version.
+
+See also [resolution](#resolution-resolve).
+
## while
Use **while** to refer only to something occurring in time. For example,
diff --git a/doc/development/testing_guide/flaky_tests.md b/doc/development/testing_guide/flaky_tests.md
index 4e27736520f..ca81f7002f4 100644
--- a/doc/development/testing_guide/flaky_tests.md
+++ b/doc/development/testing_guide/flaky_tests.md
@@ -333,6 +333,17 @@ If a spec hangs, it might be caused by a [bug in Rails](https://github.com/rails
It could help to split the large RSpec files in multiple files in order to narrow down the context and identify the problematic tests.
+### Recreate job failure in CI by forcing the job to run the same set of test files
+
+Reproducing a job failure in CI always helps with troubleshooting why and how a test fails. This require us running the same test files with the same spec order. Since we use Knapsack to distribute tests across parallelized jobs, and files can be distributed differently between two pipelines, we can hardcode this job distribution through the following steps:
+
+1. Find a job that you want to reproduce, identify the commit that it ran against, set your local `gitlab-org/gitlab` branch to the same commit to ensure we are running with the same copy of the project.
+1. In the job log, locate the list of spec files that were distributed by Knapsack - you can search for `Running command: bundle exec rspec`, the last argument of this command should contain a list of file names. Copy this list.
+1. Go to `tooling/lib/tooling/parallel_rspec_runner.rb` where the test file distribution happens. Have a look at [this merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137924/diffs) as an example, store the file list you copied from step 2 into a `TEST_FILES` constant and have RSpec run this list by updating the `rspec_command` method as done in the example MR.
+1. Skip the tests in `spec/tooling/lib/tooling/parallel_rspec_runner_spec.rb` so it doesn't cause your pipeline to fail early.
+1. Since we want to force the pipeline to run against a specific version, we do not want to run a merged results pipeline. We can introduce a merge conflict into the MR to achieve this.
+1. To preserve spec ordering, update the `spec/support/rspec_order.rb` file by hard coding `Kernel.srand` with the value shown in the originally failing job, as done [here](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/128428/diffs#32f6fa4961481518204e227252552dba7483c3b0_62_62). You can fine the srand value in the job log by searching `Randomized with seed` which is followed by this value.
+
## Resources
- [Flaky Tests: Are You Sure You Want to Rerun Them?](https://semaphoreci.com/blog/2017/04/20/flaky-tests.html)
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index 26cbc4c5d8b..85874692725 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -22,63 +22,71 @@ You can create a merge request from the list of merge requests.
1. On the left sidebar, select **Search or go to** and find your project.
1. Select **Code > Merge requests**.
1. In the upper-right corner, select **New merge request**.
-1. Select a source and target branch and then **Compare branches and continue**.
-1. Fill out the fields and select **Create merge request**.
+1. Select a source and target branch, then select **Compare branches and continue**.
+1. Complete the fields on the **New merge request** page, then select **Create merge request**.
-NOTE:
-Merge requests are designed around a one-to-one (1:1) branch relationship. Only one open merge request can
-be associated with a given target branch at a time.
+Each branch can be associated with only one open merge request. If a merge request
+already exists for this branch, a link to the existing merge request is shown.
## From an issue
-> The **Create merge request** button [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/349566) to open the merge request creation form in GitLab 14.8.
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/349566) the behavior of the **Create merge request** button to open the merge request creation form in GitLab 14.8.
If your development workflow requires an issue for every merge
request, you can create a branch directly from the issue to speed the process up.
The new branch, and later its merge request, are marked as related to this issue.
After merging the merge request, the issue is closed automatically, unless
-[automatic issue closing is disabled](../issues/managing_issues.md#disable-automatic-issue-closing).
-You can see a **Create merge request** dropdown list below the issue description.
+[automatic issue closing is disabled](../issues/managing_issues.md#disable-automatic-issue-closing):
-NOTE:
-In GitLab 14.8 and later, selecting **Create merge request**
-[redirects to the merge request creation form](https://gitlab.com/gitlab-org/gitlab/-/issues/349566)
-instead of immediately creating the merge request.
+::Tabs
-**Create merge request** doesn't display if:
+:::TabTitle Merge request and branch
-- A branch with the same name already exists.
-- A merge request already exists for this branch.
-- Your project has an active fork relationship.
-- Your project is private and the issue is confidential.
+To create a branch and a merge request at the same time:
-To make this button appear, one possible workaround is to
-[remove your project's fork relationship](../repository/forking_workflow.md#unlink-a-fork).
-After removal, the fork relationship cannot be restored. This project can no longer
-be able to receive or send merge requests to the source project, or other forks.
+1. On the left sidebar, select **Search or go to** and find your project.
+1. Select **Issues** and find your issue.
+1. Go to the bottom of the issue description.
+1. Select **Create merge request > Create merge request and branch**.
+1. In the dialog, review the suggested branch name. It's based on your project's
+ [branch name template](../repository/branches/index.md) Rename it if the
+ branch name is already taken, or you need a different branch name.
+1. Select a source branch or tag.
+1. Select **Create merge request**.
-The dropdown list contains the options **Create merge request and branch** and **Create branch**.
+:::TabTitle Branch only
-After selecting one of these options, a new branch or branch and merge request
-is created based on your project's [default branch](../repository/branches/default.md).
-The branch name is based on your project's [branch name template](../repository/branches/index.md),
-but this value can be changed.
+To create only a branch directly from an issue:
-When you select **Create branch** in an empty
-repository project, GitLab performs these actions:
+1. On the left sidebar, select **Search or go to** and find your project.
+1. Select **Plan > Issues** and find your issue.
+1. Go to the bottom of the issue description.
+1. Select **Create merge request > Create branch**.
+1. In the dialog, review the suggested branch name. It's based on your project's
+ [branch name template](../repository/branches/index.md) Rename it if the
+ branch name is already taken, or you need a different branch name.
+1. Select a source branch or tag.
+1. Select **Create branch**.
+
+::EndTabs
+
+If your Git repository is empty, GitLab:
- Creates a default branch.
- Commits a blank `README.md` file to it.
- Creates and redirects you to a new branch based on the issue title.
-- _If your project is [configured with a deployment service](../integrations/index.md) like Kubernetes,_
+- If your project is [configured with a deployment service](../integrations/index.md) like Kubernetes,
GitLab prompts you to set up [auto deploy](../../../topics/autodevops/stages.md#auto-deploy)
by helping you create a `.gitlab-ci.yml` file.
-After the branch is created, you can edit files in the repository to fix
-the issue. When a merge request is created based on the newly-created branch,
-the description field displays the [issue closing pattern](../issues/managing_issues.md#closing-issues-automatically)
-`Closes #ID`, where `ID` is the ID of the issue. This closes the issue when the
-merge request is merged.
+If the name of the branch you create is
+[prefixed with the issue number](../repository/branches/index.md#prefix-branch-names-with-issue-numbers),
+GitLab cross-links the issue and merge request, and adds the
+[issue closing pattern](../issues/managing_issues.md#closing-issues-automatically)
+to the description of the merge request. In most cases, this looks like `Closes #ID`,
+where `ID` is the ID of the issue. If your project is configured with a
+[closing pattern](../issues/managing_issues.md#default-closing-pattern), the issue closes
+when the merge request merges.
## When you add, edit, or upload a file
@@ -86,10 +94,11 @@ You can create a merge request when you add, edit, or upload a file to a reposit
1. [Add, edit, or upload](../repository/web_editor.md) a file to the repository.
1. In the **Commit message**, enter a reason for the commit.
-1. Select the **Target branch** or create a new branch by typing the name (without spaces).
+1. Select the **Target branch** or create a new branch by typing the name.
1. Select the **Start a new merge request with these changes** checkbox or toggle. This checkbox or toggle is visible only
if the target is not the same as the source branch, or if the source branch is protected.
-1. Select **Commit changes**.
+1. Select **Upload file**.
+1. Fill out the fields and select **Create merge request**.
## When you create a branch
@@ -112,20 +121,27 @@ You can create a merge request by running Git commands on your local machine.
git checkout -b my-new-branch
```
-1. Create, edit, or delete files. The stage and commit them:
+1. Create, edit, or delete files as needed.
+
+1. Mark the files as ready to commit (staging them) and commit them locally:
```shell
+ # Mark the files as ready to commit
git add .
+ # Commit the changes locally
git commit -m "My commit message"
```
-1. [Push your branch to GitLab](../../../gitlab-basics/start-using-git.md#send-changes-to-gitlab):
+1. [Push your branch and its commits to GitLab](../../../gitlab-basics/start-using-git.md#send-changes-to-gitlab):
```shell
git push origin my-new-branch
```
- GitLab prompts you with a direct link for creating a merge request:
+ To reduce the number of fields to edit later in the merge request, use
+ [push options](../push_options.md) to set the value of fields.
+
+1. In the response to the `git push`, GitLab provides a direct link to create the merge request:
```plaintext
...
@@ -135,9 +151,6 @@ You can create a merge request by running Git commands on your local machine.
1. Copy the link and paste it in your browser.
-You can add other [flags to commands when pushing through the command line](../push_options.md)
-to reduce the need for editing merge requests manually through the UI.
-
## When you work in a fork
You can create a merge request from your fork to contribute back to the main project.
@@ -220,3 +233,19 @@ To have merge requests from a fork by default target your own fork
1. In the **Target project** section, select the option you want to use for
your default target project.
1. Select **Save changes**.
+
+## Troubleshooting
+
+### No option to create a merge request on an issue
+
+The option to **Create merge request** doesn't display on an issue if:
+
+- A branch with the same name already exists.
+- A merge request already exists for this branch.
+- Your project has an active fork relationship.
+- Your project is private and the issue is confidential.
+
+To make this button appear, one possible workaround is to
+[remove your project's fork relationship](../repository/forking_workflow.md#unlink-a-fork).
+After removal, the fork relationship cannot be restored. This project can no longer
+be able to receive or send merge requests to the source project, or other forks.
diff --git a/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
index 7d923245d79..7cde1e4019e 100644
--- a/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.60.0'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0'
.dast-auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index 0f8d5bf6d8f..94da30de869 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.60.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
index e29d18ea45a..17c3c3b467d 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.60.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index e3771ccfe46..bf6f03be161 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -27578,6 +27578,9 @@ msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Exit full screen"
+msgstr ""
+
msgid "Job|External links"
msgstr ""
@@ -27587,6 +27590,9 @@ msgstr ""
msgid "Job|Finished at"
msgstr ""
+msgid "Job|Full screen mode is not available"
+msgstr ""
+
msgid "Job|Job artifacts"
msgstr ""
@@ -27659,6 +27665,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Show full screen"
+msgstr ""
+
msgid "Job|Skipped"
msgstr ""
diff --git a/qa/gdk/Dockerfile.gdk b/qa/gdk/Dockerfile.gdk
index 9a1a0b46b4d..34f2673dbf1 100644
--- a/qa/gdk/Dockerfile.gdk
+++ b/qa/gdk/Dockerfile.gdk
@@ -106,6 +106,6 @@ ENTRYPOINT [ "/home/gdk/entrypoint" ]
CMD [ "gdk", "tail" ]
HEALTHCHECK --interval=10s --timeout=1s --start-period=5s --retries=17 \
- CMD curl --fail http://0.0.0.0:3000/users/sign_in || exit 1
+ CMD curl --fail http://gdk.test:3000/users/sign_in || exit 1
EXPOSE 3000
diff --git a/spec/frontend/ci/job_details/components/job_log_controllers_spec.js b/spec/frontend/ci/job_details/components/job_log_controllers_spec.js
index 4e1b9fe83da..078ad4aee34 100644
--- a/spec/frontend/ci/job_details/components/job_log_controllers_spec.js
+++ b/spec/frontend/ci/job_details/components/job_log_controllers_spec.js
@@ -57,6 +57,10 @@ describe('Job log controllers', () => {
const findJobLogSearch = () => wrapper.findComponent(GlSearchBoxByClick);
const findSearchHelp = () => wrapper.findComponent(HelpPopover);
const findScrollFailure = () => wrapper.find('[data-testid="job-controller-scroll-to-failure"]');
+ const findShowFullScreenButton = () =>
+ wrapper.find('[data-testid="job-controller-enter-fullscreen"]');
+ const findExitFullScreenButton = () =>
+ wrapper.find('[data-testid="job-controller-exit-fullscreen"]');
describe('Truncate information', () => {
describe('with isJobLogSizeVisible', () => {
@@ -305,4 +309,53 @@ describe('Job log controllers', () => {
expect(wrapper.emitted('searchResults')).toEqual([[[]]]);
});
});
+
+ describe('Fullscreen controls', () => {
+ it('displays a disabled "Show fullscreen" button', () => {
+ createWrapper();
+
+ expect(findShowFullScreenButton().exists()).toBe(true);
+ expect(findShowFullScreenButton().attributes('disabled')).toBe('disabled');
+ });
+
+ it('displays a enabled "Show fullscreen" button', () => {
+ createWrapper({
+ fullScreenModeAvailable: true,
+ });
+
+ expect(findShowFullScreenButton().exists()).toBe(true);
+ expect(findShowFullScreenButton().attributes('disabled')).toBeUndefined();
+ });
+
+ it('emits a enterFullscreen event when the show fullscreen is clicked', async () => {
+ createWrapper({
+ fullScreenModeAvailable: true,
+ });
+
+ await findShowFullScreenButton().trigger('click');
+
+ expect(wrapper.emitted('enterFullscreen')).toHaveLength(1);
+ });
+
+ it('displays a enabled "Exit fullscreen" button', () => {
+ createWrapper({
+ fullScreenModeAvailable: true,
+ fullScreenEnabled: true,
+ });
+
+ expect(findExitFullScreenButton().exists()).toBe(true);
+ expect(findExitFullScreenButton().attributes('disabled')).toBeUndefined();
+ });
+
+ it('emits a exitFullscreen event when the exit fullscreen is clicked', async () => {
+ createWrapper({
+ fullScreenModeAvailable: true,
+ fullScreenEnabled: true,
+ });
+
+ await findExitFullScreenButton().trigger('click');
+
+ expect(wrapper.emitted('exitFullscreen')).toHaveLength(1);
+ });
+ });
});
diff --git a/spec/frontend/ci/job_details/components/log/log_spec.js b/spec/frontend/ci/job_details/components/log/log_spec.js
index f3877d70457..de02c7aad6d 100644
--- a/spec/frontend/ci/job_details/components/log/log_spec.js
+++ b/spec/frontend/ci/job_details/components/log/log_spec.js
@@ -44,6 +44,7 @@ describe('Job Log', () => {
toggleCollapsibleLineMock = jest.fn();
actions = {
toggleCollapsibleLine: toggleCollapsibleLineMock,
+ setupFullScreenListeners: jest.fn(),
};
const { lines, sections } = logLinesParser(mockJobLog);
diff --git a/spec/frontend/ci/job_details/store/actions_spec.js b/spec/frontend/ci/job_details/store/actions_spec.js
index 15e4b80a3ff..9c4b241b6eb 100644
--- a/spec/frontend/ci/job_details/store/actions_spec.js
+++ b/spec/frontend/ci/job_details/store/actions_spec.js
@@ -26,6 +26,9 @@ import {
toggleSidebar,
receiveTestSummarySuccess,
requestTestSummary,
+ enterFullscreenSuccess,
+ exitFullscreenSuccess,
+ fullScreenContainerSetUpResult,
} from '~/ci/job_details/store/actions';
import { isScrolledToBottom } from '~/lib/utils/scroll_utils';
@@ -61,6 +64,7 @@ describe('Job State actions', () => {
{
type: types.SET_JOB_LOG_OPTIONS,
payload: {
+ fullScreenAPIAvailable: false,
jobEndpoint: mockJobEndpoint,
logEndpoint: mockLogEndpoint,
testReportSummaryUrl: '/group1/project1/-/jobs/99/test_report_summary.json',
@@ -606,4 +610,40 @@ describe('Job State actions', () => {
});
});
});
+
+ describe('enterFullscreenSuccess', () => {
+ it('should commit ENTER_FULLSCREEN_SUCCESS mutation', () => {
+ return testAction(
+ enterFullscreenSuccess,
+ {},
+ mockedState,
+ [{ type: types.ENTER_FULLSCREEN_SUCCESS }],
+ [],
+ );
+ });
+ });
+
+ describe('exitFullscreenSuccess', () => {
+ it('should commit EXIT_FULLSCREEN_SUCCESS mutation', () => {
+ return testAction(
+ exitFullscreenSuccess,
+ {},
+ mockedState,
+ [{ type: types.EXIT_FULLSCREEN_SUCCESS }],
+ [],
+ );
+ });
+ });
+
+ describe('fullScreenContainerSetUpResult', () => {
+ it('should commit FULL_SCREEN_CONTAINER_SET_UP mutation', () => {
+ return testAction(
+ fullScreenContainerSetUpResult,
+ {},
+ mockedState,
+ [{ type: types.FULL_SCREEN_CONTAINER_SET_UP, payload: {} }],
+ [],
+ );
+ });
+ });
});
diff --git a/spec/frontend/ci/job_details/store/mutations_spec.js b/spec/frontend/ci/job_details/store/mutations_spec.js
index 8ebf36bc0a0..d42e4c40107 100644
--- a/spec/frontend/ci/job_details/store/mutations_spec.js
+++ b/spec/frontend/ci/job_details/store/mutations_spec.js
@@ -324,4 +324,34 @@ describe('Jobs Store Mutations', () => {
expect(stateCopy.jobs).toEqual([]);
});
});
+
+ describe('ENTER_FULLSCREEN_SUCCESS', () => {
+ beforeEach(() => {
+ mutations[types.ENTER_FULLSCREEN_SUCCESS](stateCopy);
+ });
+
+ it('sets fullScreenEnabled to true', () => {
+ expect(stateCopy.fullScreenEnabled).toEqual(true);
+ });
+ });
+
+ describe('EXIT_FULLSCREEN_SUCCESS', () => {
+ beforeEach(() => {
+ mutations[types.EXIT_FULLSCREEN_SUCCESS](stateCopy);
+ });
+
+ it('sets fullScreenEnabled to false', () => {
+ expect(stateCopy.fullScreenEnabled).toEqual(false);
+ });
+ });
+
+ describe('FULL_SCREEN_CONTAINER_SET_UP', () => {
+ beforeEach(() => {
+ mutations[types.FULL_SCREEN_CONTAINER_SET_UP](stateCopy, true);
+ });
+
+ it('sets fullScreenEnabled to true', () => {
+ expect(stateCopy.fullScreenContainerSetUp).toEqual(true);
+ });
+ });
});