diff options
Diffstat (limited to 'spec/presenters/packages/helm/index_presenter_spec.rb')
-rw-r--r-- | spec/presenters/packages/helm/index_presenter_spec.rb | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/spec/presenters/packages/helm/index_presenter_spec.rb b/spec/presenters/packages/helm/index_presenter_spec.rb new file mode 100644 index 00000000000..38e1dc17f49 --- /dev/null +++ b/spec/presenters/packages/helm/index_presenter_spec.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Packages::Helm::IndexPresenter do + include_context 'with expected presenters dependency groups' + + let_it_be(:project) { create(:project) } + let_it_be(:packages) { create_list(:helm_package, 5, project: project) } + let_it_be(:package_files3_1) { create(:helm_package_file, package: packages[2], file_sha256: '3_1', file_name: 'file3_1') } + let_it_be(:package_files3_2) { create(:helm_package_file, package: packages[2], file_sha256: '3_2', file_name: 'file3_2') } + let_it_be(:package_files4_1) { create(:helm_package_file, package: packages[3], file_sha256: '4_1', file_name: 'file4_1') } + let_it_be(:package_files4_2) { create(:helm_package_file, package: packages[3], file_sha256: '4_2', file_name: 'file4_2') } + let_it_be(:package_files4_3) { create(:helm_package_file, package: packages[3], file_sha256: '4_3', file_name: 'file4_3') } + + let(:project_id_param) { project.id } + let(:channel) { 'stable' } + let(:presenter) { described_class.new(project_id_param, channel, ::Packages::Package.id_in(packages.map(&:id))) } + + describe('#entries') do + subject { presenter.entries } + + it 'returns the correct hash' do + expect(subject.size).to eq(5) + expect(subject.keys).to eq(packages.map(&:name)) + subject.values.zip(packages) do |raws, pkg| + expect(raws.size).to eq(1) + + file = pkg.package_files.recent.first + raw = raws.first + expect(raw['name']).to eq(pkg.name) + expect(raw['version']).to eq(pkg.version) + expect(raw['apiVersion']).to eq("v2") + expect(raw['created']).to eq(file.created_at.utc.strftime('%Y-%m-%dT%H:%M:%S.%NZ')) + expect(raw['digest']).to eq(file.file_sha256) + expect(raw['urls']).to eq(["charts/#{file.file_name}"]) + end + end + + context 'with an unknown channel' do + let(:channel) { 'unknown' } + + it { is_expected.to be_empty } + end + + context 'with a nil channel' do + let(:channel) { nil } + + it { is_expected.to be_empty } + end + end + + describe('#api_version') do + subject { presenter.api_version } + + it { is_expected.to eq(described_class::API_VERSION) } + end + + describe('#generated') do + subject { presenter.generated } + + it 'returns the expected format' do + freeze_time do + expect(subject).to eq(Time.zone.now.utc.strftime('%Y-%m-%dT%H:%M:%S.%NZ')) + end + end + end + + describe('#server_info') do + subject { presenter.server_info } + + it { is_expected.to eq({ 'contextPath' => "/api/v4/projects/#{project.id}/packages/helm" }) } + + context 'with url encoded project id param' do + let_it_be(:project_id_param) { 'foo/bar' } + + it { is_expected.to eq({ 'contextPath' => '/api/v4/projects/foo%2Fbar/packages/helm' }) } + end + end +end |