diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /spec/models/terraform | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'spec/models/terraform')
-rw-r--r-- | spec/models/terraform/state_spec.rb | 62 | ||||
-rw-r--r-- | spec/models/terraform/state_version_spec.rb | 76 |
2 files changed, 129 insertions, 9 deletions
diff --git a/spec/models/terraform/state_spec.rb b/spec/models/terraform/state_spec.rb index 68bb86bfa49..01ae80a61d1 100644 --- a/spec/models/terraform/state_spec.rb +++ b/spec/models/terraform/state_spec.rb @@ -7,8 +7,9 @@ RSpec.describe Terraform::State do let(:terraform_state_file) { fixture_file('terraform/terraform.tfstate') } - it { is_expected.to belong_to(:project) } + it { is_expected.to be_a FileStoreMounter } + it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:locked_by_user).class_name('User') } it { is_expected.to validate_presence_of(:project_id) } @@ -23,14 +24,6 @@ RSpec.describe Terraform::State do expect(subject.file.read).to eq(terraform_state_file) end end - - context 'when no file exists' do - subject { create(:terraform_state) } - - it 'creates a default file' do - expect(subject.file.read).to eq('{"version":1}') - end - end end describe '#file_store' do @@ -56,4 +49,55 @@ RSpec.describe Terraform::State do it_behaves_like 'mounted file in local store' end end + + describe '#latest_file' do + subject { terraform_state.latest_file } + + context 'versioning is enabled' do + let(:terraform_state) { create(:terraform_state, :with_version) } + let(:latest_version) { terraform_state.latest_version } + + it { is_expected.to eq latest_version.file } + + context 'but no version exists yet' do + let(:terraform_state) { create(:terraform_state) } + + it { is_expected.to be_nil } + end + end + + context 'versioning is disabled' do + let(:terraform_state) { create(:terraform_state, :with_file) } + + it { is_expected.to eq terraform_state.file } + end + end + + describe '#update_file!' do + let(:version) { 2 } + let(:data) { Hash[terraform_version: '0.12.21'].to_json } + + subject { terraform_state.update_file!(CarrierWaveStringFile.new(data), version: version) } + + context 'versioning is enabled' do + let(:terraform_state) { create(:terraform_state) } + + it 'creates a new version' do + expect { subject }.to change { Terraform::StateVersion.count } + + expect(terraform_state.latest_version.version).to eq(version) + expect(terraform_state.latest_version.file.read).to eq(data) + end + end + + context 'versioning is disabled' do + let(:terraform_state) { create(:terraform_state, :with_file) } + + it 'modifies the existing state record' do + expect { subject }.not_to change { Terraform::StateVersion.count } + + expect(terraform_state.latest_file.read).to eq(data) + end + end + end end diff --git a/spec/models/terraform/state_version_spec.rb b/spec/models/terraform/state_version_spec.rb new file mode 100644 index 00000000000..72dd29e1571 --- /dev/null +++ b/spec/models/terraform/state_version_spec.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Terraform::StateVersion do + it { is_expected.to be_a FileStoreMounter } + + it { is_expected.to belong_to(:terraform_state).required } + it { is_expected.to belong_to(:created_by_user).class_name('User').optional } + + describe 'scopes' do + describe '.ordered_by_version_desc' do + let(:terraform_state) { create(:terraform_state) } + let(:versions) { [4, 2, 5, 1, 3] } + + subject { described_class.ordered_by_version_desc } + + before do + versions.each do |version| + create(:terraform_state_version, terraform_state: terraform_state, version: version) + end + end + + it { expect(subject.map(&:version)).to eq(versions.sort.reverse) } + end + end + + context 'file storage' do + subject { create(:terraform_state_version) } + + before do + stub_terraform_state_object_storage(Terraform::StateUploader) + end + + describe '#file' do + let(:terraform_state_file) { fixture_file('terraform/terraform.tfstate') } + + before do + subject.file = CarrierWaveStringFile.new(terraform_state_file) + subject.save! + end + + it 'returns the saved file' do + expect(subject.file.read).to eq(terraform_state_file) + end + end + + describe '#file_store' do + it 'returns the value' do + [ObjectStorage::Store::LOCAL, ObjectStorage::Store::REMOTE].each do |store| + subject.update!(file_store: store) + + expect(subject.file_store).to eq(store) + end + end + end + + describe '#update_file_store' do + context 'when file is stored in object storage' do + it 'sets file_store to remote' do + expect(subject.file_store).to eq(ObjectStorage::Store::REMOTE) + end + end + + context 'when file is stored locally' do + before do + stub_terraform_state_object_storage(enabled: false) + end + + it 'sets file_store to local' do + expect(subject.file_store).to eq(ObjectStorage::Store::LOCAL) + end + end + end + end +end |