gcp_spec.rb 7.83 KB
Newer Older
Kamil Trzcinski's avatar
Kamil Trzcinski committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
require 'spec_helper'

feature 'Gcp Cluster', :js do
  include GoogleApi::CloudPlatformHelpers

  let(:project) { create(:project) }
  let(:user) { create(:user) }

  before do
    project.add_master(user)
    gitlab_sign_in(user)
    allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 }
  end

  context 'when user has signed with Google' do
16 17
    let(:project_id) { 'test-project-1234' }

Kamil Trzcinski's avatar
Kamil Trzcinski committed
18 19 20 21 22 23 24
    before do
      allow_any_instance_of(Projects::Clusters::GcpController)
        .to receive(:token_in_session).and_return('token')
      allow_any_instance_of(Projects::Clusters::GcpController)
        .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
    end

25
    context 'when user has a GCP project with billing enabled' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
26
      before do
27
        allow_any_instance_of(Projects::Clusters::GcpController).to receive(:authorize_google_project_billing)
28
        allow_any_instance_of(Projects::Clusters::GcpController).to receive(:google_project_billing_status).and_return(true)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
29 30
      end

31
      context 'when user does not have a cluster and visits cluster index page' do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
32
        before do
33 34
          visit project_clusters_path(project)

35
          click_link 'Add Kubernetes cluster'
36
          click_link 'Create on Google Kubernetes Engine'
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
        end

        context 'when user filled form with valid parameters' do
          before do
            allow_any_instance_of(GoogleApi::CloudPlatform::Client)
              .to receive(:projects_zones_clusters_create) do
              OpenStruct.new(
                self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
                status: 'RUNNING'
              )
            end

            allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)

            fill_in 'cluster_provider_gcp_attributes_gcp_project_id', with: 'gcp-project-123'
            fill_in 'cluster_name', with: 'dev-cluster'
53
            click_button 'Create Kubernetes cluster'
Kamil Trzcinski's avatar
Kamil Trzcinski committed
54 55
          end

56
          it 'user sees a cluster details page and creation status' do
57
            expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
58

59
            Clusters::Cluster.last.provider.make_created!
Kamil Trzcinski's avatar
Kamil Trzcinski committed
60

61
            expect(page).to have_content('Kubernetes cluster was successfully created on Google Kubernetes Engine')
62
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
63

64
          it 'user sees a error if something worng during creation' do
65
            expect(page).to have_content('Kubernetes cluster is being created on Google Kubernetes Engine...')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
66

67
            Clusters::Cluster.last.provider.make_errored!('Something wrong!')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
68

69 70 71
            expect(page).to have_content('Something wrong!')
          end
        end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
72

73 74
        context 'when user filled form with invalid parameters' do
          before do
75
            click_button 'Create Kubernetes cluster'
76
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
77

78 79 80
          it 'user sees a validation error' do
            expect(page).to have_css('#error_explanation')
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
81 82 83
        end
      end

84 85 86
      context 'when user does have a cluster and visits cluster page' do
        let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }

Kamil Trzcinski's avatar
Kamil Trzcinski committed
87
        before do
88
          visit project_cluster_path(project, cluster)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
89 90
        end

91
        it 'user sees a cluster details page' do
92
          expect(page).to have_button('Save changes')
93
          expect(page.find(:css, '.cluster-name').value).to eq(cluster.name)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
94 95
        end

96 97
        context 'when user disables the cluster' do
          before do
98
            page.find(:css, '.js-cluster-enable-toggle-area .js-project-feature-toggle').click
99
            page.within('#cluster-integration') { click_button 'Save changes' }
100
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
101

102
          it 'user sees the successful message' do
103
            expect(page).to have_content('Kubernetes cluster was successfully updated.')
104 105
          end
        end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
106

107 108 109
        context 'when user changes cluster parameters' do
          before do
            fill_in 'cluster_platform_kubernetes_attributes_namespace', with: 'my-namespace'
110
            page.within('#js-cluster-details') { click_button 'Save changes' }
111
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
112

113
          it 'user sees the successful message' do
114
            expect(page).to have_content('Kubernetes cluster was successfully updated.')
115 116
            expect(cluster.reload.platform_kubernetes.namespace).to eq('my-namespace')
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
117
        end
118

119 120 121 122 123 124 125 126
        context 'when user destroy the cluster' do
          before do
            page.accept_confirm do
              click_link 'Remove integration'
            end
          end

          it 'user sees creation form with the successful message' do
127 128
            expect(page).to have_content('Kubernetes cluster integration was successfully removed.')
            expect(page).to have_link('Add Kubernetes cluster')
129
          end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
130 131
        end
      end
132
    end
133

134 135
    context 'when user does not have a GCP project with billing enabled' do
      before do
136
        allow_any_instance_of(Projects::Clusters::GcpController).to receive(:authorize_google_project_billing)
137
        allow_any_instance_of(Projects::Clusters::GcpController).to receive(:google_project_billing_status).and_return(false)
138

139
        visit project_clusters_path(project)
140

141
        click_link 'Add Kubernetes cluster'
142
        click_link 'Create on Google Kubernetes Engine'
143 144 145

        fill_in 'cluster_provider_gcp_attributes_gcp_project_id', with: 'gcp-project-123'
        fill_in 'cluster_name', with: 'dev-cluster'
146
        click_button 'Create Kubernetes cluster'
147 148 149
      end

      it 'user sees form with error' do
150
        expect(page).to have_content('Please enable billing for one of your projects to be able to create a Kubernetes cluster, then try again.')
151 152 153 154 155 156 157 158 159 160
      end
    end

    context 'when gcp billing status is not in redis' do
      before do
        allow_any_instance_of(Projects::Clusters::GcpController).to receive(:authorize_google_project_billing)
        allow_any_instance_of(Projects::Clusters::GcpController).to receive(:google_project_billing_status).and_return(nil)

        visit project_clusters_path(project)

161
        click_link 'Add Kubernetes cluster'
162
        click_link 'Create on Google Kubernetes Engine'
163 164 165

        fill_in 'cluster_provider_gcp_attributes_gcp_project_id', with: 'gcp-project-123'
        fill_in 'cluster_name', with: 'dev-cluster'
166
        click_button 'Create Kubernetes cluster'
Kamil Trzcinski's avatar
Kamil Trzcinski committed
167
      end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
168

169 170
      it 'user sees form with error' do
        expect(page).to have_content('We could not verify that one of your projects on GCP has billing enabled. Please try again.')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
171 172 173 174 175 176 177 178
      end
    end
  end

  context 'when user has not signed with Google' do
    before do
      visit project_clusters_path(project)

179
      click_link 'Add Kubernetes cluster'
180
      click_link 'Create on Google Kubernetes Engine'
Kamil Trzcinski's avatar
Kamil Trzcinski committed
181 182 183 184
    end

    it 'user sees a login page' do
      expect(page).to have_css('.signin-with-google')
185
      expect(page).to have_link('Google account')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
186 187
    end
  end
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227

  context 'when user has not dismissed GCP signup offer' do
    before do
      visit project_clusters_path(project)
    end

    it 'user sees offer on cluster index page' do
      expect(page).to have_css('.gcp-signup-offer')
    end

    it 'user sees offer on cluster create page' do
      click_link 'Add Kubernetes cluster'

      expect(page).to have_css('.gcp-signup-offer')
    end

    it 'user sees offer on cluster GCP login page' do
      click_link 'Add Kubernetes cluster'
      click_link 'Create on Google Kubernetes Engine'

      expect(page).to have_css('.gcp-signup-offer')
    end
  end

  context 'when user has dismissed GCP signup offer' do
    before do
      visit project_clusters_path(project)
    end

    it 'user does not see offer after dismissing' do
      expect(page).to have_css('.gcp-signup-offer')

      find('.gcp-signup-offer .close').click
      wait_for_requests

      click_link 'Add Kubernetes cluster'

      expect(page).not_to have_css('.gcp-signup-offer')
    end
  end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
228
end