summaryrefslogtreecommitdiff
path: root/spec/features/projects/pages_lets_encrypt_spec.rb
blob: baa217cbe580a8b5d70de0a72bcce6c4a90759cf (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
# frozen_string_literal: true
require 'spec_helper'

describe "Pages with Let's Encrypt", :https_pages_enabled do
  let(:project) { create(:project) }
  let(:user) { create(:user) }
  let(:role) { :maintainer }
  let(:certificate_pem) do
    <<~PEM
    -----BEGIN CERTIFICATE-----
    MIICGzCCAYSgAwIBAgIBATANBgkqhkiG9w0BAQUFADAbMRkwFwYDVQQDExB0ZXN0
    LWNlcnRpZmljYXRlMB4XDTE2MDIxMjE0MzIwMFoXDTIwMDQxMjE0MzIwMFowGzEZ
    MBcGA1UEAxMQdGVzdC1jZXJ0aWZpY2F0ZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
    gYkCgYEApL4J9L0ZxFJ1hI1LPIflAlAGvm6ZEvoT4qKU5Xf2JgU7/2geNR1qlNFa
    SvCc08Knupp5yTgmvyK/Xi09U0N82vvp4Zvr/diSc4A/RA6Mta6egLySNT438kdT
    nY2tR5feoTLwQpX0t4IMlwGQGT5h6Of2fKmDxzuwuyffcIHqLdsCAwEAAaNvMG0w
    DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUxl9WSxBprB0z0ibJs3rXEk0+95AwCwYD
    VR0PBAQDAgXgMBEGCWCGSAGG+EIBAQQEAwIGQDAeBglghkgBhvhCAQ0EERYPeGNh
    IGNlcnRpZmljYXRlMA0GCSqGSIb3DQEBBQUAA4GBAGC4T8SlFHK0yPSa+idGLQFQ
    joZp2JHYvNlTPkRJ/J4TcXxBTJmArcQgTIuNoBtC+0A/SwdK4MfTCUY4vNWNdese
    5A4K65Nb7Oh1AdQieTBHNXXCdyFsva9/ScfQGEl7p55a52jOPs0StPd7g64uvjlg
    YHi2yesCrOvVXt+lgPTd
    -----END CERTIFICATE-----
    PEM
  end

  let(:certificate_key) do
    <<~KEY
    -----BEGIN PRIVATE KEY-----
    MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKS+CfS9GcRSdYSN
    SzyH5QJQBr5umRL6E+KilOV39iYFO/9oHjUdapTRWkrwnNPCp7qaeck4Jr8iv14t
    PVNDfNr76eGb6/3YknOAP0QOjLWunoC8kjU+N/JHU52NrUeX3qEy8EKV9LeCDJcB
    kBk+Yejn9nypg8c7sLsn33CB6i3bAgMBAAECgYA2D26w80T7WZvazYr86BNMePpd
    j2mIAqx32KZHzt/lhh40J/SRtX9+Kl0Y7nBoRR5Ja9u/HkAIxNxLiUjwg9r6cpg/
    uITEF5nMt7lAk391BuI+7VOZZGbJDsq2ulPd6lO+C8Kq/PI/e4kXcIjeH6KwQsuR
    5vrXfBZ3sQfflaiN4QJBANBt8JY2LIGQF8o89qwUpRL5vbnKQ4IzZ5+TOl4RLR7O
    AQpJ81tGuINghO7aunctb6rrcKJrxmEH1whzComybrMCQQDKV49nOBudRBAIgG4K
    EnLzsRKISUHMZSJiYTYnablof8cKw1JaQduw7zgrUlLwnroSaAGX88+Jw1f5n2Lh
    Vlg5AkBDdUGnrDLtYBCDEQYZHblrkc7ZAeCllDOWjxUV+uMqlCv8A4Ey6omvY57C
    m6I8DkWVAQx8VPtozhvHjUw80rZHAkB55HWHAM3h13axKG0htCt7klhPsZHpx6MH
    EPjGlXIT+aW2XiPmK3ZlCDcWIenE+lmtbOpI159Wpk8BGXs/s/xBAkEAlAY3ymgx
    63BDJEwvOb2IaP8lDDxNsXx9XJNVvQbv5n15vNsLHbjslHfAhAbxnLQ1fLhUPqSi
    nNp/xedE1YxutQ==
    -----END PRIVATE KEY-----
    KEY
  end

  before do
    allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
    project.add_role(user, role)
    sign_in(user)
    project.namespace.update(owner: user)
    allow_any_instance_of(Project).to receive(:pages_deployed?) { true }
  end

  context 'when the page_auto_ssl feature flag is enabled' do
    before do
      stub_feature_flags(pages_auto_ssl: true)
    end

    context 'when the auto SSL management is initially disabled' do
      let(:domain) do
        create(:pages_domain, auto_ssl_enabled: false, project: project)
      end

      it 'enables auto SSL and dynamically updates the form accordingly', :js do
        visit edit_project_pages_domain_path(project, domain)

        expect(domain.auto_ssl_enabled).to eq false

        expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'false'
        expect(page).to have_field 'Certificate (PEM)', type: 'textarea'
        expect(page).to have_field 'Key (PEM)', type: 'textarea'

        find('.js-auto-ssl-toggle-container .project-feature-toggle').click

        expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true'
        expect(page).not_to have_field 'Certificate (PEM)', type: 'textarea'
        expect(page).not_to have_field 'Key (PEM)', type: 'textarea'
        expect(page).to have_content "The certificate will be shown here once it has been obtained from Let's Encrypt. This process may take up to an hour to complete."

        click_on 'Save Changes'

        expect(domain.reload.auto_ssl_enabled).to eq true
      end
    end

    context 'when the auto SSL management is initially enabled' do
      let(:domain) do
        create(:pages_domain, auto_ssl_enabled: true, project: project)
      end

      it 'disables auto SSL and dynamically updates the form accordingly', :js do
        visit edit_project_pages_domain_path(project, domain)

        expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'true'
        expect(page).to have_field 'Certificate (PEM)', type: 'textarea', disabled: true
        expect(page).not_to have_field 'Key (PEM)', type: 'textarea'

        find('.js-auto-ssl-toggle-container .project-feature-toggle').click

        expect(find("#pages_domain_auto_ssl_enabled", visible: false).value).to eq 'false'
        expect(page).to have_field 'Certificate (PEM)', type: 'textarea'
        expect(page).to have_field 'Key (PEM)', type: 'textarea'

        fill_in 'Certificate (PEM)', with: certificate_pem
        fill_in 'Key (PEM)', with: certificate_key

        click_on 'Save Changes'

        expect(domain.reload.auto_ssl_enabled).to eq false
      end
    end
  end

  context 'when the page_auto_ssl feature flag is disabled' do
    let(:domain) do
      create(:pages_domain, auto_ssl_enabled: false, project: project)
    end

    before do
      stub_feature_flags(pages_auto_ssl: false)

      visit edit_project_pages_domain_path(project, domain)
    end

    it "does not render the Let's Encrypt field", :js do
      expect(page).not_to have_selector '.js-auto-ssl-toggle-container'
    end
  end
end