Skip to content
Snippets Groups Projects
Commit e079ae52 authored by Naman Jagdish Gala's avatar Naman Jagdish Gala 💬
Browse files

Add support in UI to select Pages primary domain

Related: #481334

Changelog: added
parent e08fd7fd
No related branches found
No related tags found
No related merge requests found
......@@ -85,7 +85,7 @@ def project_params_attributes
# overridden in EE
def project_setting_attributes
[:pages_unique_domain_enabled]
[:pages_unique_domain_enabled, :pages_primary_domain]
end
end
......
......@@ -741,6 +741,18 @@ def project_delete_immediately_button_data(project)
})
end
def project_pages_domain_choices
pages_url = build_pages_url(@project)
blank_option = [[_('GitLabPages|Don’t enforce a primary domain'), '']]
gitlab_default_option = [[pages_url, pages_url]]
domain_options = @project&.pages_domains&.map { |domain| [domain.url, domain.url] } || []
options_for_select(
blank_option + domain_options + gitlab_default_option,
selected: @project.project_setting.pages_primary_domain
)
end
private
def delete_message_data(project)
......
......@@ -20,5 +20,15 @@
%p.gl-pl-6
= s_("GitLabPages|When enabled, a unique domain is generated to access pages.").html_safe
- if Gitlab.config.pages.external_http || Gitlab.config.pages.external_https
- if @project&.pages_domains.present?
.form-group
= f.fields_for :project_setting do |settings|
= f.label :pages_primary_domain, class: 'label-bold' do
= s_('GitLabPages|Primary domain')
= settings.select :pages_primary_domain, project_pages_domain_choices, {}, class: 'form-control'
.form-text.gl-text-subtle
= s_('GitLabPages|If selected, requests to your Pages site from any other domain (including the GitLab-provided domain) are redirected here. Use this to ensure all visitors (and search engines) see a single, consistent domain.')
.gl-mt-3
= f.submit s_('GitLabPages|Save changes'), pajamas_button: true
......@@ -25517,6 +25517,9 @@ msgstr ""
msgid "GitLabPages|Domains"
msgstr ""
 
msgid "GitLabPages|Don’t enforce a primary domain"
msgstr ""
msgid "GitLabPages|Edit"
msgstr ""
 
......@@ -25526,6 +25529,9 @@ msgstr ""
msgid "GitLabPages|Force HTTPS (requires valid certificates)"
msgstr ""
 
msgid "GitLabPages|If selected, requests to your Pages site from any other domain (including the GitLab-provided domain) are redirected here. Use this to ensure all visitors (and search engines) see a single, consistent domain."
msgstr ""
msgid "GitLabPages|Maximum size (MB)"
msgstr ""
 
......@@ -25538,6 +25544,9 @@ msgstr ""
msgid "GitLabPages|Pages"
msgstr ""
 
msgid "GitLabPages|Primary domain"
msgstr ""
msgid "GitLabPages|Regenerate unique domain"
msgstr ""
 
......@@ -218,6 +218,82 @@
end
end
end
context 'when updating pages_primary_domain' do
let(:request_params) do
{
namespace_id: project.namespace,
project_id: project,
project: {
project_setting_attributes: {
pages_primary_domain: pages_primary_domain
}
}
}
end
before do
create(:project_setting, project: project)
end
context 'when pages_primary_domain is updated' do
let(:pages_primary_domain) { 'http://default.com' }
it 'updates pages_primary_domain and redirects back to pages settings' do
expect_next_instance_of(Projects::UpdateService) do |service|
expect(service)
.to receive(:validate_pages_default_domain_redirect)
.and_return(true)
end
expect { patch :update, params: request_params }
.to change { project.project_setting.reload.pages_primary_domain }
.from(nil).to('http://default.com')
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(project_pages_path(project))
end
end
context 'when pages_primary_domain is reset' do
let(:pages_primary_domain) { '' }
it 'resets pages_primary_domain to nil' do
project.project_setting.update!(pages_primary_domain: 'http://default.com')
expect_next_instance_of(Projects::UpdateService) do |service|
expect(service)
.to receive(:validate_pages_default_domain_redirect)
.and_return(true)
end
expect { patch :update, params: request_params }
.to change { project.project_setting.reload.pages_primary_domain }
.from('http://default.com').to(nil)
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(project_pages_path(project))
end
end
context 'when it fails to update' do
let(:pages_primary_domain) { 'http://default.com' }
it 'adds an error message' do
expect_next_instance_of(Projects::UpdateService) do |service|
expect(service)
.to receive(:execute)
.and_return(status: :error, message: 'some error happened')
end
expect { patch :update, params: request_params }
.not_to change { project.project_setting.reload.pages_primary_domain }
expect(response).to redirect_to(project_pages_path(project))
expect(flash[:alert]).to eq('some error happened')
end
end
end
end
describe 'POST regenerate_unique_domain' do
......
......@@ -2043,4 +2043,37 @@ def license_name
})
end
end
describe '#project_pages_domain_choices' do
subject { helper.project_pages_domain_choices }
let(:pages_url) { "http://pages.example.com" }
let(:blank_option) { [['GitLabPages|Don’t enforce a primary domain', '']] }
let(:gitlab_default_option) { [[pages_url, pages_url]] }
before do
allow(helper).to receive(:build_pages_url).with(project).and_return(pages_url)
end
context 'when the project has no pages domains' do
it 'returns only the default options' do
expect(subject).to eq(options_for_select(blank_option + gitlab_default_option))
end
end
context 'when the project has pages domains' do
let!(:pages_domains) do
[
create(:pages_domain, project: project, domain: 'custom1.com'),
create(:pages_domain, project: project, domain: 'custom2.com')
]
end
it 'returns default options and additional domain options' do
domain_options = pages_domains.map { |domain| [domain.url, domain.url] }
expect(subject).to eq(options_for_select(blank_option + domain_options + gitlab_default_option))
end
end
end
end
......@@ -7,6 +7,12 @@
let_it_be(:user) { build_stubbed(:user) }
before do
stub_config(pages: {
enabled: true,
external_http: true,
external_https: true,
access_control: false
})
assign(:project, project)
allow(view).to receive(:current_user).and_return(user)
end
......@@ -18,4 +24,31 @@
expect(rendered).to have_content('Use unique domain')
end
end
context 'when pages_domains is empty' do
before do
allow(project).to receive(:pages_domains).and_return([])
end
it 'does not render the redirect domains section' do
render
expect(rendered).not_to have_selector('.form-group', text: 'Primary domain')
end
end
context 'when pages_domains is not empty' do
before do
allow(project).to receive(:pages_domains).and_return([build_stubbed(:pages_domain)])
allow(view).to receive(:project_pages_domain_choices).and_return(
options_for_select([['new.domain.com', 'new.domain.com']])
)
end
it 'renders the redirect domains section' do
render
expect(rendered).to have_content('Primary domain')
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment