pages_spec.rb 9.99 KB
Newer Older
1 2
require 'spec_helper'

3 4 5
describe 'Pages' do
  let(:project) { create(:project) }
  let(:user) { create(:user) }
6
  let(:role) { :maintainer }
7

8
  before do
9 10
    allow(Gitlab.config.pages).to receive(:enabled).and_return(true)

11
    project.add_role(user, role)
12

13
    sign_in(user)
14 15 16
  end

  context 'when user is the owner' do
17
    before do
18 19 20 21
      project.namespace.update(owner: user)
    end

    context 'when pages deployed' do
22
      before do
23 24 25
        allow_any_instance_of(Project).to receive(:pages_deployed?) { true }
      end

26
      it 'renders Access pages' do
27
        visit project_pages_path(project)
28

29 30 31 32 33 34 35 36 37 38 39
        expect(page).to have_content('Access pages')
      end

      context 'when support for external domains is disabled' do
        it 'renders message that support is disabled' do
          visit project_pages_path(project)

          expect(page).to have_content('Support for domains and certificates is disabled')
        end
      end

Rob Watson's avatar
Rob Watson committed
40
      context 'when pages are exposed on external HTTP address', :http_pages_enabled do
41
        let(:project) { create(:project, pages_https_only: false) }
Rob Watson's avatar
Rob Watson committed
42

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
        shared_examples 'adds new domain' do
          it 'adds new domain' do
            visit new_project_pages_domain_path(project)

            fill_in 'Domain', with: 'my.test.domain.com'
            click_button 'Create New Domain'

            expect(page).to have_content('my.test.domain.com')
          end
        end

        it 'allows to add new domain' do
          visit project_pages_path(project)

          expect(page).to have_content('New Domain')
        end

        it_behaves_like 'adds new domain'

        context 'when project in group namespace' do
          it_behaves_like 'adds new domain' do
            let(:group) { create :group }
Rob Watson's avatar
Rob Watson committed
65
            let(:project) { create(:project, namespace: group, pages_https_only: false) }
66 67 68 69 70
          end
        end

        context 'when pages domain is added' do
          before do
Rob Watson's avatar
Rob Watson committed
71
            create(:pages_domain, project: project, domain: 'my.test.domain.com')
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

            visit new_project_pages_domain_path(project)
          end

          it 'renders certificates is disabled' do
            expect(page).to have_content('Support for custom certificates is disabled')
          end

          it 'does not adds new domain and renders error message' do
            fill_in 'Domain', with: 'my.test.domain.com'
            click_button 'Create New Domain'

            expect(page).to have_content('Domain has already been taken')
          end
        end
      end

Rob Watson's avatar
Rob Watson committed
89
      context 'when pages are exposed on external HTTPS address', :https_pages_enabled do
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
        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

        it 'adds new domain with certificate' do
          visit new_project_pages_domain_path(project)

          fill_in 'Domain', with: 'my.test.domain.com'
          fill_in 'Certificate (PEM)', with: certificate_pem
          fill_in 'Key (PEM)', with: certificate_key
          click_button 'Create New Domain'

          expect(page).to have_content('my.test.domain.com')
        end
140 141 142

        describe 'updating the certificate for an existing domain' do
          let!(:domain) do
Rob Watson's avatar
Rob Watson committed
143
            create(:pages_domain, project: project)
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
          end

          it 'allows the certificate to be updated' do
            visit project_pages_path(project)

            within('#content-body') { click_link 'Details' }
            click_link 'Edit'
            click_button 'Save Changes'

            expect(page).to have_content('Domain was updated')
          end

          context 'when the certificate is invalid' do
            it 'tells the user what the problem is' do
              visit project_pages_path(project)

              within('#content-body') { click_link 'Details' }
              click_link 'Edit'
              fill_in 'Certificate (PEM)', with: 'invalid data'
              click_button 'Save Changes'

              expect(page).to have_content('Certificate must be a valid PEM certificate')
              expect(page).to have_content('Certificate misses intermediates')
              expect(page).to have_content("Key doesn't match the certificate")
            end
          end
        end
171 172 173
      end
    end

174 175 176 177 178 179
    it 'does not see anything to destroy' do
      visit project_pages_path(project)

      expect(page).to have_content('Configure pages')
      expect(page).not_to have_link('Remove pages')
    end
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

    describe 'project settings page' do
      it 'renders "Pages" tab' do
        visit edit_project_path(project)

        page.within '.nav-sidebar' do
          expect(page).to have_link('Pages')
        end
      end

      context 'when pages are disabled' do
        before do
          allow(Gitlab.config.pages).to receive(:enabled).and_return(false)
        end

        it 'does not render "Pages" tab' do
          visit edit_project_path(project)

          page.within '.nav-sidebar' do
            expect(page).not_to have_link('Pages')
          end
        end
      end
    end
204 205
  end

Rob Watson's avatar
Rob Watson committed
206
  describe 'HTTPS settings', :js, :https_pages_enabled do
207
    before do
Rob Watson's avatar
Rob Watson committed
208 209 210 211 212
      project.namespace.update(owner: user)

      allow_any_instance_of(Project).to receive(:pages_deployed?) { true }
    end

213
    it 'tries to change the setting' do
Rob Watson's avatar
Rob Watson committed
214 215 216 217 218 219 220 221 222 223 224 225
      visit project_pages_path(project)
      expect(page).to have_content("Force domains with SSL certificates to use HTTPS")

      uncheck :project_pages_https_only

      click_button 'Save'

      expect(page).to have_text('Your changes have been saved')
      expect(page).not_to have_checked_field('project_pages_https_only')
    end

    context 'setting could not be updated' do
226 227
      let(:service) { instance_double('Projects::UpdateService') }

Rob Watson's avatar
Rob Watson committed
228
      before do
229 230
        allow(Projects::UpdateService).to receive(:new).and_return(service)
        allow(service).to receive(:execute).and_return(status: :error)
Rob Watson's avatar
Rob Watson committed
231 232
      end

233
      it 'tries to change the setting' do
Rob Watson's avatar
Rob Watson committed
234 235 236 237 238 239 240 241 242 243 244
        visit project_pages_path(project)

        uncheck :project_pages_https_only

        click_button 'Save'

        expect(page).to have_text('Something went wrong on our end')
      end
    end

    context 'non-HTTPS domain exists' do
245
      let(:project) { create(:project, pages_https_only: false) }
Rob Watson's avatar
Rob Watson committed
246 247 248 249 250

      before do
        create(:pages_domain, :without_key, :without_certificate, project: project)
      end

251
      it 'the setting is disabled' do
Rob Watson's avatar
Rob Watson committed
252 253 254 255 256 257 258 259
        visit project_pages_path(project)

        expect(page).to have_field(:project_pages_https_only, disabled: true)
        expect(page).not_to have_button('Save')
      end
    end

    context 'HTTPS pages are disabled', :https_pages_disabled do
260
      it 'the setting is unavailable' do
Rob Watson's avatar
Rob Watson committed
261 262 263 264 265 266 267 268 269
        visit project_pages_path(project)

        expect(page).not_to have_field(:project_pages_https_only)
        expect(page).not_to have_content('Force domains with SSL certificates to use HTTPS')
        expect(page).not_to have_button('Save')
      end
    end
  end

270
  describe 'Remove page' do
271 272 273 274 275 276 277 278 279 280 281 282
    let(:project) { create :project, :repository }

    context 'when pages are deployed' do
      let(:pipeline) do
        commit_sha = project.commit('HEAD').sha

        project.ci_pipelines.create(
          ref: 'HEAD',
          sha: commit_sha,
          source: :push,
          protected: false
        )
283 284
      end

285 286 287 288 289 290 291 292 293 294
      let(:ci_build) do
        create(
          :ci_build,
          project: project,
          pipeline: pipeline,
          ref: 'HEAD',
          legacy_artifacts_file: fixture_file_upload(File.join('spec/fixtures/pages.zip')),
          legacy_artifacts_metadata: fixture_file_upload(File.join('spec/fixtures/pages.zip.meta'))
        )
      end
295

296 297 298 299 300
      before do
        result = Projects::UpdatePagesService.new(project, ci_build).execute
        expect(result[:status]).to eq(:success)
        expect(project).to be_pages_deployed
      end
301

302 303
      it 'removes the pages' do
        visit project_pages_path(project)
304

305
        expect(page).to have_link('Remove pages')
306

307
        click_link 'Remove pages'
308

309
        expect(project.pages_deployed?).to be_falsey
310 311 312
      end
    end
  end
313
end