pages_domains_controller_spec.rb 5.23 KB
Newer Older
1 2 3
require 'spec_helper'

describe Projects::PagesDomainsController do
4
  let(:user) { create(:user) }
5
  let(:project) { create(:project) }
6
  let!(:pages_domain) { create(:pages_domain, project: project) }
7 8 9 10 11 12 13 14

  let(:request_params) do
    {
      namespace_id: project.namespace,
      project_id: project
    }
  end

15 16 17 18
  let(:pages_domain_params) do
    build(:pages_domain, :with_certificate, :with_key, domain: 'my.otherdomain.com').slice(:key, :certificate, :domain)
  end

19
  before do
20
    allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
21
    sign_in(user)
22
    project.add_master(user)
23 24 25 26 27 28
  end

  describe 'GET show' do
    it "displays the 'show' page" do
      get(:show, request_params.merge(id: pages_domain.domain))

29
      expect(response).to have_gitlab_http_status(200)
30 31 32 33 34 35 36 37
      expect(response).to render_template('show')
    end
  end

  describe 'GET new' do
    it "displays the 'new' page" do
      get(:new, request_params)

38
      expect(response).to have_gitlab_http_status(200)
39 40 41 42 43 44 45 46 47 48
      expect(response).to render_template('new')
    end
  end

  describe 'POST create' do
    it "creates a new pages domain" do
      expect do
        post(:create, request_params.merge(pages_domain: pages_domain_params))
      end.to change { PagesDomain.count }.by(1)

49 50 51 52 53 54 55
      created_domain = PagesDomain.reorder(:id).last

      expect(created_domain).to be_present
      expect(response).to redirect_to(project_pages_domain_path(project, created_domain))
    end
  end

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
  describe 'GET edit' do
    it "displays the 'edit' page" do
      get(:edit, request_params.merge(id: pages_domain.domain))

      expect(response).to have_gitlab_http_status(200)
      expect(response).to render_template('edit')
    end
  end

  describe 'PATCH update' do
    before do
      controller.instance_variable_set(:@domain, pages_domain)
    end

    let(:pages_domain_params) do
      attributes_for(:pages_domain, :with_certificate, :with_key).slice(:key, :certificate)
    end

    let(:params) do
      request_params.merge(id: pages_domain.domain, pages_domain: pages_domain_params)
    end

    it 'updates the domain' do
      expect(pages_domain)
        .to receive(:update)
        .with(pages_domain_params)
        .and_return(true)

      patch(:update, params)
    end

    it 'redirects to the project page' do
      patch(:update, params)

      expect(flash[:notice]).to eq 'Domain was updated'
      expect(response).to redirect_to(project_pages_path(project))
    end

    context 'the domain is invalid' do
      it 'renders the edit action' do
        allow(pages_domain).to receive(:update).and_return(false)

        patch(:update, params)

        expect(response).to render_template('edit')
      end
    end

    context 'the parameters include the domain' do
      it 'renders 400 Bad Request' do
        expect(pages_domain)
          .to receive(:update)
          .with(hash_not_including(:domain))
          .and_return(true)

        patch(:update, params.deep_merge(pages_domain: { domain: 'abc' }))
      end
    end
  end

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
  describe 'POST verify' do
    let(:params) { request_params.merge(id: pages_domain.domain) }

    def stub_service
      service = double(:service)

      expect(VerifyPagesDomainService).to receive(:new) { service }

      service
    end

    it 'handles verification success' do
      expect(stub_service).to receive(:execute).and_return(status: :success)

      post :verify, params

      expect(response).to redirect_to project_pages_domain_path(project, pages_domain)
      expect(flash[:notice]).to eq('Successfully verified domain ownership')
    end

    it 'handles verification failure' do
      expect(stub_service).to receive(:execute).and_return(status: :failed)

      post :verify, params

      expect(response).to redirect_to project_pages_domain_path(project, pages_domain)
      expect(flash[:alert]).to eq('Failed to verify domain ownership')
    end

    it 'returns a 404 response for an unknown domain' do
      post :verify, request_params.merge(id: 'unknown-domain')

      expect(response).to have_gitlab_http_status(404)
149 150 151 152 153 154 155 156 157
    end
  end

  describe 'DELETE destroy' do
    it "deletes the pages domain" do
      expect do
        delete(:destroy, request_params.merge(id: pages_domain.domain))
      end.to change { PagesDomain.count }.by(-1)

158
      expect(response).to redirect_to(project_pages_path(project))
159 160
    end
  end
161 162 163 164 165 166 167 168 169 170

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

    describe 'GET show' do
      it 'returns 404 status' do
        get(:show, request_params.merge(id: pages_domain.domain))

171
        expect(response).to have_gitlab_http_status(404)
172 173 174 175 176 177 178
      end
    end

    describe 'GET new' do
      it 'returns 404 status' do
        get :new, request_params

179
        expect(response).to have_gitlab_http_status(404)
180 181 182 183 184 185 186
      end
    end

    describe 'POST create' do
      it "returns 404 status" do
        post(:create, request_params.merge(pages_domain: pages_domain_params))

187
        expect(response).to have_gitlab_http_status(404)
188 189 190 191 192 193 194
      end
    end

    describe 'DELETE destroy' do
      it "deletes the pages domain" do
        delete(:destroy, request_params.merge(id: pages_domain.domain))

195
        expect(response).to have_gitlab_http_status(404)
196 197 198
      end
    end
  end
199
end