summaryrefslogtreecommitdiff
path: root/spec/features/projects/project_settings_spec.rb
blob: 89d227eb98fce67314836c87d76347398ab34438 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
require 'spec_helper'

describe 'Edit Project Settings', feature: true do
  include Select2Helper

  let(:user) { create(:user) }
  let(:project) { create(:empty_project, namespace: user.namespace, path: 'gitlab', name: 'sample') }

  before do
    sign_in(user)
  end

  describe 'Project settings section', js: true do
    it 'shows errors for invalid project name' do
      visit edit_project_path(project)
      fill_in 'project_name_edit', with: 'foo&bar'
      click_button 'Save changes'
      expect(page).to have_field 'project_name_edit', with: 'foo&bar'
      expect(page).to have_content "Name can contain only letters, digits, emojis, '_', '.', dash, space. It must start with letter, digit, emoji or '_'."
      expect(page).to have_button 'Save changes'
    end

    it 'shows a successful notice when the project is updated' do
      visit edit_project_path(project)
      fill_in 'project_name_edit', with: 'hello world'
      click_button 'Save changes'
      expect(page).to have_content "Project 'hello world' was successfully updated."
    end
  end

  describe 'Rename repository section' do
    context 'with invalid characters' do
      it 'shows errors for invalid project path/name' do
        rename_project(project, name: 'foo&bar', path: 'foo&bar')
        expect(page).to have_field 'Project name', with: 'foo&bar'
        expect(page).to have_field 'Path', with: 'foo&bar'
        expect(page).to have_content "Name can contain only letters, digits, emojis, '_', '.', dash, space. It must start with letter, digit, emoji or '_'."
        expect(page).to have_content "Path can contain only letters, digits, '_', '-' and '.'. Cannot start with '-', end in '.git' or end in '.atom'"
      end
    end

    context 'when changing project name' do
      it 'renames the repository' do
        rename_project(project, name: 'bar')
        expect(find('h1.title')).to have_content(project.name)
      end

      context 'with emojis' do
        it 'shows error for invalid project name' do
          rename_project(project, name: '🚀 foo bar ☁️')
          expect(page).to have_field 'Project name', with: '🚀 foo bar ☁️'
          expect(page).not_to have_content "Name can contain only letters, digits, emojis '_', '.', dash and space. It must start with letter, digit, emoji or '_'."
        end
      end
    end

    context 'when changing project path' do
      # Not using empty project because we need a repo to exist
      let(:project) { create(:project, namespace: user.namespace, name: 'gitlabhq') }

      before(:context) do
        TestEnv.clean_test_path
      end

      after(:example) do
        TestEnv.clean_test_path
      end

      specify 'the project is accessible via the new path' do
        rename_project(project, path: 'bar')
        new_path = namespace_project_path(project.namespace, 'bar')
        visit new_path
        expect(current_path).to eq(new_path)
        expect(find('h1.title')).to have_content(project.name)
      end

      specify 'the project is accessible via a redirect from the old path' do
        old_path = project_path(project)
        rename_project(project, path: 'bar')
        new_path = namespace_project_path(project.namespace, 'bar')
        visit old_path
        expect(current_path).to eq(new_path)
        expect(find('h1.title')).to have_content(project.name)
      end

      context 'and a new project is added with the same path' do
        it 'overrides the redirect' do
          old_path = project_path(project)
          rename_project(project, path: 'bar')
          new_project = create(:empty_project, namespace: user.namespace, path: 'gitlabhq', name: 'quz')
          visit old_path
          expect(current_path).to eq(old_path)
          expect(find('h1.title')).to have_content(new_project.name)
        end
      end
    end
  end

  describe 'Transfer project section', js: true do
    # Not using empty project because we need a repo to exist
    let!(:project) { create(:project, namespace: user.namespace, name: 'gitlabhq') }
    let!(:group) { create(:group) }

    before(:context) do
      TestEnv.clean_test_path
    end

    before(:example) do
      group.add_owner(user)
    end

    after(:example) do
      TestEnv.clean_test_path
    end

    specify 'the project is accessible via the new path' do
      transfer_project(project, group)
      new_path = namespace_project_path(group, project)
      visit new_path
      expect(current_path).to eq(new_path)
      expect(find('h1.title')).to have_content(project.name)
    end

    specify 'the project is accessible via a redirect from the old path' do
      old_path = project_path(project)
      transfer_project(project, group)
      new_path = namespace_project_path(group, project)
      visit old_path
      expect(current_path).to eq(new_path)
      expect(find('h1.title')).to have_content(project.name)
    end

    context 'and a new project is added with the same path' do
      it 'overrides the redirect' do
        old_path = project_path(project)
        transfer_project(project, group)
        new_project = create(:empty_project, namespace: user.namespace, path: 'gitlabhq', name: 'quz')
        visit old_path
        expect(current_path).to eq(old_path)
        expect(find('h1.title')).to have_content(new_project.name)
      end
    end
  end
end

def rename_project(project, name: nil, path: nil)
  visit edit_project_path(project)
  fill_in('project_name', with: name) if name
  fill_in('Path', with: path) if path
  click_button('Rename project')
  wait_for_edit_project_page_reload
  project.reload
end

def transfer_project(project, namespace)
  visit edit_project_path(project)
  select2(namespace.id, from: '#new_namespace_id')
  click_button('Transfer project')
  confirm_transfer_modal
  wait_for_edit_project_page_reload
  project.reload
end

def confirm_transfer_modal
  fill_in('confirm_name_input', with: project.path)
  click_button 'Confirm'
end

def wait_for_edit_project_page_reload
  expect(find('.project-edit-container')).to have_content('Rename repository')
end