summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil TrzciƄski <ayufan@ayufan.eu>2017-03-28 15:31:03 +0000
committerJames Lopez <james@jameslopez.es>2017-04-03 12:45:13 +0200
commit36cfb0a7bd60285d1545be1fbc01452ab6c431e8 (patch)
tree6451ec7979aaad76aabe3894930c513d5ac90ed0
parent7dd4cb3ed82c734f62513f9808375ae5f1ce9d28 (diff)
downloadgitlab-ce-36cfb0a7bd60285d1545be1fbc01452ab6c431e8.tar.gz
Merge branch 'fix/gb/environments-folders-route' into 'master'
Fix environment folder route when special chars present Closes #29922 See merge request !10250
-rw-r--r--changelogs/unreleased/fix-gb-environments-folders-route.yml4
-rw-r--r--config/routes/project.rb2
-rw-r--r--spec/controllers/projects/environments_controller_spec.rb33
-rw-r--r--spec/features/projects/environments/environment_spec.rb19
-rw-r--r--spec/routing/environments_spec.rb49
5 files changed, 106 insertions, 1 deletions
diff --git a/changelogs/unreleased/fix-gb-environments-folders-route.yml b/changelogs/unreleased/fix-gb-environments-folders-route.yml
new file mode 100644
index 00000000000..fd9d9e6f168
--- /dev/null
+++ b/changelogs/unreleased/fix-gb-environments-folders-route.yml
@@ -0,0 +1,4 @@
+---
+title: Fix environment folder route when special chars present in environment name
+merge_request: 10250
+author:
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 44b8ae7aedd..512984c6f48 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -164,7 +164,7 @@ constraints(ProjectUrlConstrainer.new) do
end
collection do
- get :folder, path: 'folders/:id'
+ get :folder, path: 'folders/*id', constraints: { format: /(html|json)/ }
end
end
diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb
index 83d80b376fb..5525fbd8130 100644
--- a/spec/controllers/projects/environments_controller_spec.rb
+++ b/spec/controllers/projects/environments_controller_spec.rb
@@ -81,6 +81,39 @@ describe Projects::EnvironmentsController do
end
end
+ describe 'GET folder' do
+ before do
+ create(:environment, project: project,
+ name: 'staging-1.0/review',
+ state: :available)
+ end
+
+ context 'when using default format' do
+ it 'responds with HTML' do
+ get :folder, namespace_id: project.namespace,
+ project_id: project,
+ id: 'staging-1.0'
+
+ expect(response).to be_ok
+ expect(response).to render_template 'folder'
+ end
+ end
+
+ context 'when using JSON format' do
+ it 'responds with JSON' do
+ get :folder, namespace_id: project.namespace,
+ project_id: project,
+ id: 'staging-1.0',
+ format: :json
+
+ expect(response).to be_ok
+ expect(response).not_to render_template 'folder'
+ expect(json_response['environments'][0])
+ .to include('name' => 'staging-1.0/review')
+ end
+ end
+ end
+
describe 'GET show' do
context 'with valid id' do
it 'responds with a status code 200' do
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index e2d16e0830a..acc3efe04e6 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -166,6 +166,25 @@ feature 'Environment', :feature do
end
end
+ feature 'environment folders', :js do
+ context 'when folder name contains special charaters' do
+ before do
+ create(:environment, project: project,
+ name: 'staging-1.0/review',
+ state: :available)
+
+ visit folder_namespace_project_environments_path(project.namespace,
+ project,
+ id: 'staging-1.0')
+ end
+
+ it 'renders a correct environment folder' do
+ expect(page).to have_http_status(:ok)
+ expect(page).to have_content('Environments / staging-1.0')
+ end
+ end
+ end
+
feature 'auto-close environment when branch is deleted' do
given(:project) { create(:project) }
diff --git a/spec/routing/environments_spec.rb b/spec/routing/environments_spec.rb
new file mode 100644
index 00000000000..ba124de70bb
--- /dev/null
+++ b/spec/routing/environments_spec.rb
@@ -0,0 +1,49 @@
+require 'spec_helper'
+
+describe Projects::EnvironmentsController, :routing do
+ let(:project) { create(:empty_project) }
+
+ let(:environment) do
+ create(:environment, project: project,
+ name: 'staging-1.0/review')
+ end
+
+ let(:environments_route) do
+ "#{project.namespace.name}/#{project.name}/environments/"
+ end
+
+ describe 'routing environment folders' do
+ context 'when using JSON format' do
+ it 'correctly matches environment name and JSON format' do
+ expect(get_folder('staging-1.0.json'))
+ .to route_to(*folder_action(id: 'staging-1.0', format: 'json'))
+ end
+ end
+
+ context 'when using HTML format' do
+ it 'correctly matches environment name and HTML format' do
+ expect(get_folder('staging-1.0.html'))
+ .to route_to(*folder_action(id: 'staging-1.0', format: 'html'))
+ end
+ end
+
+ context 'when using implicit format' do
+ it 'correctly matches environment name' do
+ expect(get_folder('staging-1.0'))
+ .to route_to(*folder_action(id: 'staging-1.0'))
+ end
+ end
+ end
+
+ def get_folder(folder)
+ get("#{project.namespace.name}/#{project.name}/" \
+ "environments/folders/#{folder}")
+ end
+
+ def folder_action(**opts)
+ options = { namespace_id: project.namespace.name,
+ project_id: project.name }
+
+ ['projects/environments#folder', options.merge(opts)]
+ end
+end