diff --git a/app/assets/javascripts/pages/projects/new/index.js b/app/assets/javascripts/pages/projects/new/index.js
index d022428df984b2ba844f7a06ed230a53e306ae8d..c2cf729fa8c26ea5a65eba0fb24b4fc80a1216cc 100644
--- a/app/assets/javascripts/pages/projects/new/index.js
+++ b/app/assets/javascripts/pages/projects/new/index.js
@@ -3,8 +3,10 @@ import {
initNewProjectUrlSelect,
initDeploymentTargetSelect,
} from '~/projects/new';
+import { initNewProjectForm } from '~/projects/new_v2';
import initProjectVisibilitySelector from '~/projects/project_visibility';
+initNewProjectForm();
initProjectVisibilitySelector();
initNewProjectCreation();
initNewProjectUrlSelect();
diff --git a/app/assets/javascripts/projects/new/index.js b/app/assets/javascripts/projects/new/index.js
index 4e336c6ec9fa8c2dd02351af3b33ba6973fcb9c4..6e9cb7b3336e2fb939f55d6cc745d247193ee581 100644
--- a/app/assets/javascripts/projects/new/index.js
+++ b/app/assets/javascripts/projects/new/index.js
@@ -10,6 +10,10 @@ import DeploymentTargetSelect from './components/deployment_target_select.vue';
export function initNewProjectCreation() {
const el = document.querySelector('.js-new-project-creation');
+ if (!el) {
+ return null;
+ }
+
const {
pushToCreateProjectCommand,
projectHelpPath,
diff --git a/app/assets/javascripts/projects/new_v2/components/app.vue b/app/assets/javascripts/projects/new_v2/components/app.vue
new file mode 100644
index 0000000000000000000000000000000000000000..de5114309f1a6f29e3274009afc29751c98ec408
--- /dev/null
+++ b/app/assets/javascripts/projects/new_v2/components/app.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+ {{ s__('ProjectsNew|A personal project') }}
+
+
+ {{ s__('ProjectsNew|A project within a group') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $options.OPTIONS.import.title }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/assets/javascripts/projects/new_v2/components/project_destination_select.vue b/app/assets/javascripts/projects/new_v2/components/project_destination_select.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7c5a0269aef64d41f95a13368fe52587f5fac971
--- /dev/null
+++ b/app/assets/javascripts/projects/new_v2/components/project_destination_select.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ searchSummary }}
+
+
+
diff --git a/app/assets/javascripts/projects/new_v2/event_hub.js b/app/assets/javascripts/projects/new_v2/event_hub.js
new file mode 100644
index 0000000000000000000000000000000000000000..e31806ad199a1105985ed7045009d84e33856386
--- /dev/null
+++ b/app/assets/javascripts/projects/new_v2/event_hub.js
@@ -0,0 +1,3 @@
+import createEventHub from '~/helpers/event_hub_factory';
+
+export default createEventHub();
diff --git a/app/assets/javascripts/projects/new_v2/index.js b/app/assets/javascripts/projects/new_v2/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..92db791b3b6dbc4676c55ea3df743a3e08bec0bd
--- /dev/null
+++ b/app/assets/javascripts/projects/new_v2/index.js
@@ -0,0 +1,61 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import NewProjectFormApp from './components/app.vue';
+
+export function initNewProjectForm() {
+ const el = document.getElementById('js-vue-new-project-app');
+
+ if (!el) {
+ return null;
+ }
+
+ const {
+ pushToCreateProjectCommand,
+ projectHelpPath,
+ hasErrors,
+ isCiCdAvailable,
+ parentGroupUrl,
+ parentGroupName,
+ rootPath,
+ projectsUrl,
+ canImportProjects,
+ importSourcesEnabled,
+ namespaceFullPath,
+ namespaceId,
+ userNamespaceId,
+ trackLabel,
+ } = el.dataset;
+
+ const props = {
+ hasErrors: parseBoolean(hasErrors),
+ isCiCdAvailable: parseBoolean(isCiCdAvailable),
+ parentGroupUrl,
+ parentGroupName,
+ rootPath,
+ projectsUrl,
+ canImportProjects: parseBoolean(canImportProjects),
+ importSourcesEnabled: parseBoolean(importSourcesEnabled),
+ namespaceFullPath,
+ namespaceId,
+ userNamespaceId,
+ trackLabel,
+ };
+
+ const provide = {
+ projectHelpPath,
+ pushToCreateProjectCommand,
+ };
+
+ return new Vue({
+ el,
+ apolloProvider: new VueApollo({
+ defaultClient: createDefaultClient(),
+ }),
+ provide,
+ render(h) {
+ return h(NewProjectFormApp, { props });
+ },
+ });
+}
diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml
index 045e547806f8ccc25a93fa96a11cd241f65f8820..50771c19ced7531958c826cbfbe1f6bb11523594 100644
--- a/app/views/projects/new.html.haml
+++ b/app/views/projects/new.html.haml
@@ -5,45 +5,63 @@
- add_page_specific_style 'page_bundles/new_namespace'
- add_page_specific_style 'page_bundles/projects'
-.project-edit-container
- .project-edit-errors
- = render 'projects/errors'
-
- .js-new-project-creation{ data: {
- is_ci_cd_available: remote_mirror_setting_enabled?.to_s,
+- if Feature.enabled?(:new_project_creation_form, @user)
+ #js-vue-new-project-app{ data: {
+ namespace_full_path: GroupFinder.new(current_user).execute(id: namespace_id_from(params))&.full_path || @current_user_group&.full_path,
+ namespace_id: namespace_id_from(params) || @current_user_group&.id,
+ user_namespace_id: current_user.namespace_id,
has_errors: @project.errors.any?.to_s,
new_project_guidelines: brand_new_project_guidelines,
push_to_create_project_command: push_to_create_project_command,
- project_help_path: help_page_path("user/project/index.md"),
root_path: root_path,
+ projects_url: dashboard_projects_url,
parent_group_url: @project.parent && group_url(@project.parent),
parent_group_name: @project.parent&.name,
- projects_url: dashboard_projects_url,
- can_import_projects: params[:namespace_id].presence ? current_user.can?(:import_projects, @namespace).to_s : 'true' } }
+ project_help_path: help_page_path("user/project/index.md"),
+ is_ci_cd_available: remote_mirror_setting_enabled?.to_s,
+ can_import_projects: params[:namespace_id].presence ? current_user.can?(:import_projects, @namespace).to_s : 'true',
+ import_sources_enabled: import_sources_enabled?.to_s,
+ track_label: local_assigns.fetch(:track_label, 'blank_project') } }
+- else
+ .project-edit-container
+ .project-edit-errors
+ = render 'projects/errors'
+
+ .js-new-project-creation{ data: {
+ is_ci_cd_available: remote_mirror_setting_enabled?.to_s,
+ has_errors: @project.errors.any?.to_s,
+ new_project_guidelines: brand_new_project_guidelines,
+ push_to_create_project_command: push_to_create_project_command,
+ project_help_path: help_page_path("user/project/index.md"),
+ root_path: root_path,
+ parent_group_url: @project.parent && group_url(@project.parent),
+ parent_group_name: @project.parent&.name,
+ projects_url: dashboard_projects_url,
+ can_import_projects: params[:namespace_id].presence ? current_user.can?(:import_projects, @namespace).to_s : 'true' } }
- .row{ 'v-cloak': true }
- #blank-project-pane.tab-pane.active
- = gitlab_ui_form_for @project, html: { class: 'new_project gl-mt-3' } do |f|
- = render 'new_project_fields', f: f, project_name_id: "blank-project-name", include_description: false
+ .row{ 'v-cloak': true }
+ #blank-project-pane.tab-pane.active
+ = gitlab_ui_form_for @project, html: { class: 'new_project gl-mt-3' } do |f|
+ = render 'new_project_fields', f: f, project_name_id: "blank-project-name", include_description: false
- #create-from-template-pane.tab-pane
- = render Pajamas::CardComponent.new(card_options: { class: 'gl-my-5' }) do |c|
- - c.with_body do
- %div
- - link = link_to('', 'https://gitlab.com/gitlab-org/project-templates/contributing', target: '_blank', rel: 'noopener noreferrer')
- = safe_format(_('Learn how to %{link_start}contribute to the built-in templates%{link_end}'), tag_pair(link, :link_start, :link_end))
- = gitlab_ui_form_for @project, html: { class: 'new_project' } do |f|
- .project-template
- .form-group
+ #create-from-template-pane.tab-pane
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-my-5' }) do |c|
+ - c.with_body do
%div
- = render 'project_templates', f: f, project: @project
+ - link = link_to('', 'https://gitlab.com/gitlab-org/project-templates/contributing', target: '_blank', rel: 'noopener noreferrer')
+ = safe_format(_('Learn how to %{link_start}contribute to the built-in templates%{link_end}'), tag_pair(link, :link_start, :link_end))
+ = gitlab_ui_form_for @project, html: { class: 'new_project' } do |f|
+ .project-template
+ .form-group
+ %div
+ = render 'project_templates', f: f, project: @project
- #import-project-pane.tab-pane.js-toggle-container
- - if import_sources_enabled?
- = render 'import_project_pane', destination_namespace_id: @namespace&.id
- - else
- .nothing-here-block
- %h4= s_('ProjectsNew|No import options available')
- %p= s_('ProjectsNew|Contact an administrator to enable options for importing your project.')
+ #import-project-pane.tab-pane.js-toggle-container
+ - if import_sources_enabled?
+ = render 'import_project_pane', destination_namespace_id: @namespace&.id
+ - else
+ .nothing-here-block
+ %h4= s_('ProjectsNew|No import options available')
+ %p= s_('ProjectsNew|Contact an administrator to enable options for importing your project.')
- = render_if_exists 'projects/new_ci_cd_only_project_pane'
+ = render_if_exists 'projects/new_ci_cd_only_project_pane'
diff --git a/config/feature_flags/wip/new_project_creation_form.yml b/config/feature_flags/wip/new_project_creation_form.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f80d4004093945172fd8b78d10a129f100f9a9c2
--- /dev/null
+++ b/config/feature_flags/wip/new_project_creation_form.yml
@@ -0,0 +1,9 @@
+---
+name: new_project_creation_form
+feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/514700
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/178859
+rollout_issue_url:
+milestone: '17.9'
+group: group::import and integrate
+type: wip
+default_enabled: false
diff --git a/ee/spec/controllers/projects_controller_spec.rb b/ee/spec/controllers/projects_controller_spec.rb
index bb41078eb5b74ebfd647e485060951afee0b232a..e8ee04fce9d77537149407f28868b35d4dc2300c 100644
--- a/ee/spec/controllers/projects_controller_spec.rb
+++ b/ee/spec/controllers/projects_controller_spec.rb
@@ -11,6 +11,7 @@
let_it_be(:public_project) { create(:project, :public, :repository, namespace: group) }
before do
+ stub_feature_flags(new_project_creation_form: false)
project.add_maintainer(user)
sign_in(user)
end
diff --git a/ee/spec/features/admin/admin_audit_logs_spec.rb b/ee/spec/features/admin/admin_audit_logs_spec.rb
index 859af8899376ce03eefd7e837a5383aa0e0febab..837c715f18a369904198959eb8d0254bbc239b2d 100644
--- a/ee/spec/features/admin/admin_audit_logs_spec.rb
+++ b/ee/spec/features/admin/admin_audit_logs_spec.rb
@@ -212,6 +212,10 @@
end
describe 'impersonated events' do
+ before do
+ stub_feature_flags(new_project_creation_form: false)
+ end
+
it 'show impersonation details' do
visit admin_user_path(user)
diff --git a/ee/spec/features/groups/compliance_framework_report_spec.rb b/ee/spec/features/groups/compliance_framework_report_spec.rb
index d7a0951d85082ee8fb48a2259043ffaf634b664f..8943c0baa0d73d585d99805e2bcbbea7c44e1690 100644
--- a/ee/spec/features/groups/compliance_framework_report_spec.rb
+++ b/ee/spec/features/groups/compliance_framework_report_spec.rb
@@ -34,6 +34,7 @@
end
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in(admin_user)
end
diff --git a/ee/spec/features/groups/group_projects_spec.rb b/ee/spec/features/groups/group_projects_spec.rb
index b8b0318f19f68bb5f54449bd7f66a3923a5cc654..ccf1981031c8ce456bbe62267efb88cd8ca404db 100644
--- a/ee/spec/features/groups/group_projects_spec.rb
+++ b/ee/spec/features/groups/group_projects_spec.rb
@@ -7,6 +7,7 @@
let(:group) { create :group }
before do
+ stub_feature_flags(new_project_creation_form: false)
group.add_owner(user)
sign_in(user)
diff --git a/ee/spec/features/projects/custom_projects_template_spec.rb b/ee/spec/features/projects/custom_projects_template_spec.rb
index 48b1ccb8f812d8d251f992e630556d138e5969f5..8023c40ad4e0d72e64976c83e612c66e7e626f05 100644
--- a/ee/spec/features/projects/custom_projects_template_spec.rb
+++ b/ee/spec/features/projects/custom_projects_template_spec.rb
@@ -9,6 +9,7 @@
let_it_be(:projects) { create_list(:project, 3, :public, :metrics_dashboard_enabled, namespace: group) }
before do
+ stub_feature_flags(new_project_creation_form: false)
stub_ee_application_setting(custom_project_templates_group_id: group.id)
end
@@ -135,6 +136,7 @@
let!(:template) { create(:project, namespace: template_subgroup) }
before do
+ stub_feature_flags(new_project_creation_form: false)
stub_licensed_features(custom_project_templates: true)
group.add_owner(user)
group.update!(custom_project_templates_group_id: template_subgroup.id)
diff --git a/ee/spec/features/projects/new_project_from_template_spec.rb b/ee/spec/features/projects/new_project_from_template_spec.rb
index 98a7820cb3a812086e474ae738a70422e7ce22d1..5d576eeaca3001b4a4db5cab3f29fcb7cf6b2d6a 100644
--- a/ee/spec/features/projects/new_project_from_template_spec.rb
+++ b/ee/spec/features/projects/new_project_from_template_spec.rb
@@ -6,6 +6,7 @@
let(:user) { create(:user) }
before do
+ stub_feature_flags(new_project_creation_form: false)
stub_licensed_features(custom_project_templates: true)
sign_in(user)
diff --git a/ee/spec/features/projects/new_project_spec.rb b/ee/spec/features/projects/new_project_spec.rb
index 35605b353e7cddbd26c3e3d65759b9200cabc0a7..919a5da213fad284642e2983d96b33d83c2b6601 100644
--- a/ee/spec/features/projects/new_project_spec.rb
+++ b/ee/spec/features/projects/new_project_spec.rb
@@ -9,6 +9,7 @@
let(:premium_plan) { create(:license, plan: License::PREMIUM_PLAN) }
before do
+ stub_feature_flags(new_project_creation_form: false)
stub_application_setting(import_sources: Gitlab::ImportSources.values)
sign_in(user)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 9cce41428badb564392ebb21e246b5665e5c8f32..c1206526f8cc4cb7b143737580f6b84e3fa99784 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -16847,6 +16847,9 @@ msgstr ""
msgid "Create new label"
msgstr ""
+msgid "Create new project"
+msgstr ""
+
msgid "Create new..."
msgstr ""
@@ -41385,6 +41388,9 @@ msgstr ""
msgid "Personal access tokens"
msgstr ""
+msgid "Personal namespaces"
+msgstr ""
+
msgid "Personal projects"
msgstr ""
@@ -44474,6 +44480,9 @@ msgstr ""
msgid "ProjectMaintenance|You will receive an email notification when the process is complete. To remove old versions from the repository, run housekeeping."
msgstr ""
+msgid "ProjectNew|What do you want to create?"
+msgstr ""
+
msgid "ProjectOverview|Create new fork"
msgstr ""
@@ -45481,6 +45490,12 @@ msgstr[1] ""
msgid "ProjectsNew|(optional)"
msgstr ""
+msgid "ProjectsNew|A personal project"
+msgstr ""
+
+msgid "ProjectsNew|A project within a group"
+msgstr ""
+
msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
msgstr ""
@@ -45490,9 +45505,18 @@ msgstr ""
msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
msgstr ""
+msgid "ProjectsNew|Available only for projects within groups"
+msgstr ""
+
+msgid "ProjectsNew|Choose a group"
+msgstr ""
+
msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
msgstr ""
+msgid "ProjectsNew|Contact an administrator to enable options for importing your project"
+msgstr ""
+
msgid "ProjectsNew|Contact an administrator to enable options for importing your project."
msgstr ""
@@ -45517,6 +45541,9 @@ msgstr ""
msgid "ProjectsNew|Description format"
msgstr ""
+msgid "ProjectsNew|Direct transfer projects with a top-level Group"
+msgstr ""
+
msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
msgstr ""
@@ -45547,6 +45574,9 @@ msgstr ""
msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
msgstr ""
+msgid "ProjectsNew|Migrate your data from another GitLab instance."
+msgstr ""
+
msgid "ProjectsNew|More templates are available after sign-up."
msgstr ""
diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb
index 314c844219247e60889d82d033a2b50e1f6b7872..828b3724b0bbd08f931ecad18913051c864a4857 100644
--- a/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Data Stores', :smoke, product_group: :tenant_scale do
+ RSpec.describe 'Data Stores', :smoke, product_group: :tenant_scale, feature_flag: {
+ name: 'new_project_creation_form'
+ } do
describe 'Project' do
shared_examples 'successful project creation' do
it 'creates a new project' do
@@ -13,6 +15,7 @@ module QA
end
before do
+ Runtime::Feature.disable(:new_project_creation_form)
Flow::Login.sign_in
project
end
diff --git a/qa/qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb b/qa/qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb
index a7884ac1b46140f7aec4a338f74173cd0ec48e6c..515a3041cf9c21e9dc849587e9f2f1dfa498f3f9 100644
--- a/qa/qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb
+++ b/qa/qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb
@@ -3,7 +3,10 @@
module QA
RSpec.describe(
'Govern',
- product_group: :compliance
+ product_group: :compliance,
+ feature_flag: {
+ name: 'new_project_creation_form'
+ }
) do
shared_examples 'audit event' do |expected_events|
it 'logs audit events for UI operations' do
@@ -21,6 +24,7 @@ module QA
let(:user) { Runtime::User::Store.additional_test_user }
before do
+ Runtime::Feature.disable(:new_project_creation_form)
sign_in
end
diff --git a/qa/qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb b/qa/qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb
index 8f78e2af49edc523dc6d6ca84f8cf62dd84711c8..02dc45bdc19d02a7be96bc0b62c6641029ed8d64 100644
--- a/qa/qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb
+++ b/qa/qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb
@@ -2,7 +2,9 @@
module QA
RSpec.describe 'Create' do
- describe 'Project templates', product_group: :source_code do
+ describe 'Project templates', product_group: :source_code, feature_flag: {
+ name: 'new_project_creation_form'
+ } do
let!(:group) { create(:group) }
let(:sandbox) { group.sandbox }
@@ -32,6 +34,7 @@ module QA
end
before do
+ Runtime::Feature.disable(:new_project_creation_form)
Resource::Repository::ProjectPush.fabricate! do |push|
push.project = template_project
push.files = files
diff --git a/spec/features/admin/admin_appearance_spec.rb b/spec/features/admin/admin_appearance_spec.rb
index bff88c0270d7c406466672c53b5e6664c21a7311..c676124e0ef53f1cb1c70fed0bd06dc2334e0491 100644
--- a/spec/features/admin/admin_appearance_spec.rb
+++ b/spec/features/admin/admin_appearance_spec.rb
@@ -11,6 +11,7 @@
let(:project) { create(:project, group: group) }
before do
+ stub_feature_flags(new_project_creation_form: false)
stub_feature_flags(edit_user_profile_vue: false)
end
diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb
index f4ed0728402a6571bd5881bc0c14295de501ab3c..7c75b58bfe6b2674459a978a43dc0e35a6785f36 100644
--- a/spec/features/projects/import_export/import_file_spec.rb
+++ b/spec/features/projects/import_export/import_file_spec.rb
@@ -10,6 +10,7 @@
before do
stub_application_setting(import_sources: ['gitlab_project'])
stub_uploads_object_storage(FileUploader)
+ stub_feature_flags(new_project_creation_form: false)
allow_next_instance_of(Gitlab::ImportExport) do |instance|
allow(instance).to receive(:storage_path).and_return(export_path)
end
diff --git a/spec/features/projects/new_project_from_template_spec.rb b/spec/features/projects/new_project_from_template_spec.rb
index 8e2016ce17e196752087e9252ee040fe7f414b78..d7df977a949ab12780e3151ac915cd9497a24bbd 100644
--- a/spec/features/projects/new_project_from_template_spec.rb
+++ b/spec/features/projects/new_project_from_template_spec.rb
@@ -6,6 +6,7 @@
let(:user) { create(:user) }
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in(user)
visit new_project_path
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index 2bfd9435c8913fdcbf29c3677f8e00b6ac8a7c87..c840a5115fcf9ee8cedb81f5f0fa2a9c8fcd5fcb 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -7,6 +7,7 @@
before do
stub_application_setting(import_sources: Gitlab::ImportSources.values)
+ stub_feature_flags(new_project_creation_form: false)
end
shared_examples 'shows correct navigation' do
@@ -35,6 +36,7 @@
let_it_be(:user) { create(:user) }
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in(user)
end
@@ -102,6 +104,7 @@
shared_examples '"New project" page' do
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in(user)
end
@@ -557,6 +560,7 @@
shared_examples 'has instructions to enable OAuth' do
context 'when OAuth is not configured' do
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in(user)
allow(Gitlab::Auth::OAuth::Provider).to receive(:enabled?).and_call_original
diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb
index b715733ca20710d2c4be0e1a03270716b732f633..4f58a5ef48bc8b43b6ded83edf6fb142a9b05688 100644
--- a/spec/features/projects/user_creates_project_spec.rb
+++ b/spec/features/projects/user_creates_project_spec.rb
@@ -8,6 +8,7 @@
let(:user) { create(:user) }
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in(user)
create(:personal_key, user: user)
end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 0da46359fc9e24e32b99d072c229e0c978f6433f..a6f3cd339277583eddd5f637dcbc6cafcd3b8778 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -10,6 +10,7 @@
let(:user) { create(:user) }
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in user
visit new_project_path
end
@@ -81,6 +82,7 @@
let(:user) { create(:user) }
before do
+ stub_feature_flags(new_project_creation_form: false)
sign_in user
visit new_project_path
end
diff --git a/spec/frontend/projects/new_v2/components/app_spec.js b/spec/frontend/projects/new_v2/components/app_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..b53adfdab4608d57a56f7e8ca884d5f59c614edc
--- /dev/null
+++ b/spec/frontend/projects/new_v2/components/app_spec.js
@@ -0,0 +1,41 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import App from '~/projects/new_v2/components/app.vue';
+import MultiStepFormTemplate from '~/vue_shared/components/multi_step_form_template.vue';
+
+describe('New project creation app', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMountExtended(App, {
+ propsData: {
+ rootPath: '/',
+ projectsUrl: '/dashboard/projects',
+ userNamespaceId: '1',
+ ...props,
+ },
+ });
+ };
+
+ const findMultyStepForm = () => wrapper.findComponent(MultiStepFormTemplate);
+
+ it('renders a form', () => {
+ createComponent();
+
+ expect(findMultyStepForm().exists()).toBe(true);
+ });
+
+ describe('personal namespace project', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('starts with personal namespace when no namespaceId provided', () => {
+ expect(wrapper.findByTestId('personal-namespace-button').props('selected')).toBe(true);
+ expect(wrapper.findByTestId('group-namespace-button').props('selected')).toBe(false);
+ });
+
+ it('does not renders a group select', () => {
+ expect(wrapper.findByTestId('group-selector').exists()).toBe(false);
+ });
+ });
+});