BigW Consortium Gitlab

project_statistics_spec.rb 5.28 KB
Newer Older
1 2
require 'rails_helper'

3
describe ProjectStatistics do
4
  let(:project) { create :project }
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
  let(:statistics) { project.statistics }

  describe 'constants' do
    describe 'STORAGE_COLUMNS' do
      it 'is an array of symbols' do
        expect(described_class::STORAGE_COLUMNS).to be_kind_of Array
        expect(described_class::STORAGE_COLUMNS.map(&:class).uniq).to eq [Symbol]
      end
    end

    describe 'STATISTICS_COLUMNS' do
      it 'is an array of symbols' do
        expect(described_class::STATISTICS_COLUMNS).to be_kind_of Array
        expect(described_class::STATISTICS_COLUMNS.map(&:class).uniq).to eq [Symbol]
      end

      it 'includes all storage columns' do
        expect(described_class::STATISTICS_COLUMNS & described_class::STORAGE_COLUMNS).to eq described_class::STORAGE_COLUMNS
      end
    end
  end

  describe 'associations' do
    it { is_expected.to belong_to(:project) }
    it { is_expected.to belong_to(:namespace) }
  end

  describe 'statistics columns' do
    it "support values up to 8 exabytes" do
      statistics.update!(
        commit_count: 8.exabytes - 1,
        repository_size: 2.exabytes,
        lfs_objects_size: 2.exabytes,
38
        build_artifacts_size: 4.exabytes - 1
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 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
      )

      statistics.reload

      expect(statistics.commit_count).to eq(8.exabytes - 1)
      expect(statistics.repository_size).to eq(2.exabytes)
      expect(statistics.lfs_objects_size).to eq(2.exabytes)
      expect(statistics.build_artifacts_size).to eq(4.exabytes - 1)
      expect(statistics.storage_size).to eq(8.exabytes - 1)
    end
  end

  describe '#total_repository_size' do
    it "sums repository and LFS object size" do
      statistics.repository_size = 2
      statistics.lfs_objects_size = 3
      statistics.build_artifacts_size = 4

      expect(statistics.total_repository_size).to eq 5
    end
  end

  describe '#refresh!' do
    before do
      allow(statistics).to receive(:update_commit_count)
      allow(statistics).to receive(:update_repository_size)
      allow(statistics).to receive(:update_lfs_objects_size)
      allow(statistics).to receive(:update_build_artifacts_size)
      allow(statistics).to receive(:update_storage_size)
    end

    context "without arguments" do
      before do
        statistics.refresh!
      end

      it "sums all counters" do
        expect(statistics).to have_received(:update_commit_count)
        expect(statistics).to have_received(:update_repository_size)
        expect(statistics).to have_received(:update_lfs_objects_size)
        expect(statistics).to have_received(:update_build_artifacts_size)
      end
    end

    context "when passing an only: argument" do
      before do
        statistics.refresh! only: [:lfs_objects_size]
      end

      it "only updates the given columns" do
        expect(statistics).to have_received(:update_lfs_objects_size)
        expect(statistics).not_to have_received(:update_commit_count)
        expect(statistics).not_to have_received(:update_repository_size)
        expect(statistics).not_to have_received(:update_build_artifacts_size)
      end
    end
  end

  describe '#update_commit_count' do
    before do
      allow(project.repository).to receive(:commit_count).and_return(23)
      statistics.update_commit_count
    end

    it "stores the number of commits in the repository" do
      expect(statistics.commit_count).to eq 23
    end
  end

  describe '#update_repository_size' do
    before do
110
      allow(project.repository).to receive(:size).and_return(12)
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
      statistics.update_repository_size
    end

    it "stores the size of the repository" do
      expect(statistics.repository_size).to eq 12.megabytes
    end
  end

  describe '#update_lfs_objects_size' do
    let!(:lfs_object1) { create(:lfs_object, size: 23.megabytes) }
    let!(:lfs_object2) { create(:lfs_object, size: 34.megabytes) }
    let!(:lfs_objects_project1) { create(:lfs_objects_project, project: project, lfs_object: lfs_object1) }
    let!(:lfs_objects_project2) { create(:lfs_objects_project, project: project, lfs_object: lfs_object2) }

    before do
      statistics.update_lfs_objects_size
    end

    it "stores the size of related LFS objects" do
      expect(statistics.lfs_objects_size).to eq 57.megabytes
    end
  end

  describe '#update_build_artifacts_size' do
    let!(:pipeline) { create(:ci_pipeline, project: project) }

137 138 139 140 141 142 143 144 145
    context 'when new job artifacts are calculated' do
      let(:ci_build) { create(:ci_build, pipeline: pipeline) }

      before do
        create(:ci_job_artifact, :archive, project: pipeline.project, job: ci_build)
      end

      it "stores the size of related build artifacts" do
        statistics.update_build_artifacts_size
146

147 148
        expect(statistics.build_artifacts_size).to be(106365)
      end
149 150
    end

151 152 153 154 155 156 157 158
    context 'when legacy artifacts are used' do
      let!(:ci_build) { create(:ci_build, pipeline: pipeline, artifacts_size: 10.megabytes) }

      it "stores the size of related build artifacts" do
        statistics.update_build_artifacts_size

        expect(statistics.build_artifacts_size).to eq(10.megabytes)
      end
159 160 161 162 163 164 165
    end
  end

  describe '#update_storage_size' do
    it "sums all storage counters" do
      statistics.update!(
        repository_size: 2,
166
        lfs_objects_size: 3
167 168 169 170 171 172 173 174
      )

      statistics.reload

      expect(statistics.storage_size).to eq 5
    end
  end
end