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
path: root/spec
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2019-09-11 16:21:38 +0300
committerKamil Trzciński <ayufan@ayufan.eu>2019-09-11 16:21:38 +0300
commit68e8bbdb54f81847379659cbaad3ae9478684e24 (patch)
tree34edf07cfc6d2bbff2707d959f20226b0f00cb18 /spec
parent3c282a88aa25129c15d219351852e1ea1f2b22b6 (diff)
parent5374f423204386a4c3e6ab887214de58c0113d75 (diff)
Merge branch '61927-pages-custom-domain-virtual-domain' into 'master'
Add support for custom domains to the Pages internal API See merge request gitlab-org/gitlab-ce!32735
Diffstat (limited to 'spec')
-rw-r--r--spec/fixtures/api/schemas/internal/pages/lookup_path.json25
-rw-r--r--spec/fixtures/api/schemas/internal/pages/virtual_domain.json16
-rw-r--r--spec/models/pages/lookup_path_spec.rb64
-rw-r--r--spec/models/pages/virtual_domain_spec.rb43
-rw-r--r--spec/models/pages_domain_spec.rb12
-rw-r--r--spec/models/project_feature_spec.rb54
-rw-r--r--spec/models/project_spec.rb11
-rw-r--r--spec/requests/api/internal/pages_spec.rb28
8 files changed, 250 insertions, 3 deletions
diff --git a/spec/fixtures/api/schemas/internal/pages/lookup_path.json b/spec/fixtures/api/schemas/internal/pages/lookup_path.json
new file mode 100644
index 00000000000..b2b3d3f9d0a
--- /dev/null
+++ b/spec/fixtures/api/schemas/internal/pages/lookup_path.json
@@ -0,0 +1,25 @@
+{
+ "type": "object",
+ "required": [
+ "project_id",
+ "https_only",
+ "access_control",
+ "source",
+ "prefix"
+ ],
+ "properties": {
+ "project_id": { "type": "integer" },
+ "https_only": { "type": "boolean" },
+ "access_control": { "type": "boolean" },
+ "source": { "type": "object",
+ "required": ["type", "path"],
+ "properties" : {
+ "type": { "type": "string", "enum": ["file"] },
+ "path": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "prefix": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/internal/pages/virtual_domain.json b/spec/fixtures/api/schemas/internal/pages/virtual_domain.json
new file mode 100644
index 00000000000..02df69026b0
--- /dev/null
+++ b/spec/fixtures/api/schemas/internal/pages/virtual_domain.json
@@ -0,0 +1,16 @@
+{
+ "type": "object",
+ "required": [
+ "lookup_paths"
+ ],
+ "optional": [
+ "certificate",
+ "key"
+ ],
+ "properties": {
+ "certificate": { "type": ["string", "null"] },
+ "key": { "type": ["string", "null"] },
+ "lookup_paths": { "type": "array", "items": { "$ref": "lookup_path.json" } }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/models/pages/lookup_path_spec.rb b/spec/models/pages/lookup_path_spec.rb
new file mode 100644
index 00000000000..2146b0c9abd
--- /dev/null
+++ b/spec/models/pages/lookup_path_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Pages::LookupPath do
+ let(:project) do
+ instance_double(Project,
+ id: 12345,
+ private_pages?: true,
+ pages_https_only?: true,
+ full_path: 'the/full/path'
+ )
+ end
+
+ subject(:lookup_path) { described_class.new(project) }
+
+ describe '#project_id' do
+ it 'delegates to Project#id' do
+ expect(lookup_path.project_id).to eq(12345)
+ end
+ end
+
+ describe '#access_control' do
+ it 'delegates to Project#private_pages?' do
+ expect(lookup_path.access_control).to eq(true)
+ end
+ end
+
+ describe '#https_only' do
+ subject(:lookup_path) { described_class.new(project, domain: domain) }
+
+ context 'when no domain provided' do
+ let(:domain) { nil }
+
+ it 'delegates to Project#pages_https_only?' do
+ expect(lookup_path.https_only).to eq(true)
+ end
+ end
+
+ context 'when there is domain provided' do
+ let(:domain) { instance_double(PagesDomain, https?: false) }
+
+ it 'takes into account the https setting of the domain' do
+ expect(lookup_path.https_only).to eq(false)
+ end
+ end
+ end
+
+ describe '#source' do
+ it 'sets the source type to "file"' do
+ expect(lookup_path.source[:type]).to eq('file')
+ end
+
+ it 'sets the source path to the project full path suffixed with "public/' do
+ expect(lookup_path.source[:path]).to eq('the/full/path/public/')
+ end
+ end
+
+ describe '#prefix' do
+ it 'returns "/"' do
+ expect(lookup_path.prefix).to eq('/')
+ end
+ end
+end
diff --git a/spec/models/pages/virtual_domain_spec.rb b/spec/models/pages/virtual_domain_spec.rb
new file mode 100644
index 00000000000..eaa57b7acd6
--- /dev/null
+++ b/spec/models/pages/virtual_domain_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Pages::VirtualDomain do
+ describe '#certificate and #key pair' do
+ let(:domain) { nil }
+ let(:project) { instance_double(Project) }
+
+ subject(:virtual_domain) { described_class.new([project], domain: domain) }
+
+ it 'returns nil if there is no domain provided' do
+ expect(virtual_domain.certificate).to be_nil
+ expect(virtual_domain.key).to be_nil
+ end
+
+ context 'when Pages domain is provided' do
+ let(:domain) { instance_double(PagesDomain, certificate: 'certificate', key: 'key') }
+
+ it 'returns certificate and key from the provided domain' do
+ expect(virtual_domain.certificate).to eq('certificate')
+ expect(virtual_domain.key).to eq('key')
+ end
+ end
+ end
+
+ describe '#lookup_paths' do
+ let(:domain) { instance_double(PagesDomain) }
+ let(:project_a) { instance_double(Project) }
+ let(:project_z) { instance_double(Project) }
+ let(:pages_lookup_path_a) { instance_double(Pages::LookupPath, prefix: 'aaa') }
+ let(:pages_lookup_path_z) { instance_double(Pages::LookupPath, prefix: 'zzz') }
+
+ subject(:virtual_domain) { described_class.new([project_a, project_z], domain: domain) }
+
+ it 'returns collection of projects pages lookup paths sorted by prefix in reverse' do
+ expect(project_a).to receive(:pages_lookup_path).with(domain: domain).and_return(pages_lookup_path_a)
+ expect(project_z).to receive(:pages_lookup_path).with(domain: domain).and_return(pages_lookup_path_z)
+
+ expect(virtual_domain.lookup_paths).to eq([pages_lookup_path_z, pages_lookup_path_a])
+ end
+ end
+end
diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb
index 5168064bb84..f745820a404 100644
--- a/spec/models/pages_domain_spec.rb
+++ b/spec/models/pages_domain_spec.rb
@@ -556,4 +556,16 @@ describe PagesDomain do
)
end
end
+
+ describe '.pages_virtual_domain' do
+ let(:project) { build(:project) }
+
+ subject(:pages_domain) { build(:pages_domain, project: project) }
+
+ it 'returns instance of Pages::VirtualDomain' do
+ expect(Pages::VirtualDomain).to receive(:new).with([project], domain: pages_domain).and_call_original
+
+ expect(pages_domain.pages_virtual_domain).to be_a(Pages::VirtualDomain)
+ end
+ end
end
diff --git a/spec/models/project_feature_spec.rb b/spec/models/project_feature_spec.rb
index dc7a8433064..e6505bb4a51 100644
--- a/spec/models/project_feature_spec.rb
+++ b/spec/models/project_feature_spec.rb
@@ -174,4 +174,58 @@ describe ProjectFeature do
it { is_expected.to eq(ProjectFeature::ENABLED) }
end
end
+
+ describe '#public_pages?' do
+ it 'returns true if Pages access controll is not enabled' do
+ stub_config(pages: { access_control: false })
+
+ project_feature = described_class.new
+
+ expect(project_feature.public_pages?).to eq(true)
+ end
+
+ context 'Pages access control is enabled' do
+ before do
+ stub_config(pages: { access_control: true })
+ end
+
+ it 'returns true if Pages access level is public' do
+ project_feature = described_class.new(pages_access_level: described_class::PUBLIC)
+
+ expect(project_feature.public_pages?).to eq(true)
+ end
+
+ it 'returns true if Pages access level is enabled and the project is public' do
+ project = build(:project, :public)
+
+ project_feature = described_class.new(project: project, pages_access_level: described_class::ENABLED)
+
+ expect(project_feature.public_pages?).to eq(true)
+ end
+
+ it 'returns false if pages or the project are not public' do
+ project = build(:project, :private)
+
+ project_feature = described_class.new(project: project, pages_access_level: described_class::ENABLED)
+
+ expect(project_feature.public_pages?).to eq(false)
+ end
+ end
+
+ describe '#private_pages?' do
+ subject(:project_feature) { described_class.new }
+
+ it 'returns false if public_pages? is true' do
+ expect(project_feature).to receive(:public_pages?).and_return(true)
+
+ expect(project_feature.private_pages?).to eq(false)
+ end
+
+ it 'returns true if public_pages? is false' do
+ expect(project_feature).to receive(:public_pages?).and_return(false)
+
+ expect(project_feature.private_pages?).to eq(true)
+ end
+ end
+ end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index e2a684c42ae..5b4b9c516a0 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -5012,6 +5012,17 @@ describe Project do
end
end
+ describe '#pages_lookup_path' do
+ let(:pages_domain) { build(:pages_domain) }
+ let(:project) { build(:project) }
+
+ it 'returns instance of Pages::LookupPath' do
+ expect(Pages::LookupPath).to receive(:new).with(project, domain: pages_domain).and_call_original
+
+ expect(project.pages_lookup_path(domain: pages_domain)).to be_a(Pages::LookupPath)
+ end
+ end
+
def rugged_config
rugged_repo(project.repository).config
end
diff --git a/spec/requests/api/internal/pages_spec.rb b/spec/requests/api/internal/pages_spec.rb
index 0b3c5be9c45..e1b563b92f4 100644
--- a/spec/requests/api/internal/pages_spec.rb
+++ b/spec/requests/api/internal/pages_spec.rb
@@ -43,10 +43,32 @@ describe API::Internal::Pages do
super(host, headers)
end
- it 'responds with 200 OK' do
- query_host('pages.gitlab.io')
+ context 'not existing host' do
+ it 'responds with 404 Not Found' do
+ query_host('pages.gitlab.io')
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+
+ context 'custom domain' do
+ let(:namespace) { create(:namespace, name: 'gitlab-org') }
+ let(:project) { create(:project, namespace: namespace, name: 'gitlab-ce') }
+ let!(:pages_domain) { create(:pages_domain, domain: 'pages.gitlab.io', project: project) }
+
+ it 'responds with the correct domain configuration' do
+ query_host('pages.gitlab.io')
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to match_response_schema('internal/pages/virtual_domain')
+
+ expect(json_response['certificate']).to eq(pages_domain.certificate)
+ expect(json_response['key']).to eq(pages_domain.key)
- expect(response).to have_gitlab_http_status(200)
+ lookup_path = json_response['lookup_paths'][0]
+ expect(lookup_path['prefix']).to eq('/')
+ expect(lookup_path['source']['path']).to eq('gitlab-org/gitlab-ce/public/')
+ end
end
end
end