# frozen_string_literal: true require 'fast_spec_helper' RSpec.describe Gitlab::Utils::LogLimitedArray do describe '.log_limited_array' do context 'when the argument is not an array' do it 'returns an empty array' do expect(described_class.log_limited_array('aa')).to eq([]) end end context 'when the argument is an array' do context 'when the array is under the limit' do it 'returns the array unchanged' do expect(described_class.log_limited_array(%w(a b))).to eq(%w(a b)) end end context 'when the array exceeds the limit' do let(:long_array) do half_limit = described_class::MAXIMUM_ARRAY_LENGTH / 2 ['a' * half_limit, 'b' * half_limit, 'c'] end context 'when no sentinel value is passed' do it 'replaces arguments after the limit with an ellipsis string' do expect(described_class.log_limited_array(long_array)) .to eq(long_array.take(1) + ['...']) end end context 'when a sentinel value is passed' do it 'replaces arguments after the limit with the sentinel' do sentinel = { truncated: true } expect(described_class.log_limited_array(long_array, sentinel: sentinel)) .to eq(long_array.take(1) + [sentinel]) end end end context 'when the array contains arrays and hashes' do it 'calculates the size based on the JSON representation' do long_array = [ 'a', ['b'] * 10, { c: 'c' * 10 }, # Each character in the array takes up four characters: the # character itself, the two quotes, and the comma (closing # square bracket for the last item) ['d'] * (described_class::MAXIMUM_ARRAY_LENGTH / 4), 'e' ] expect(described_class.log_limited_array(long_array)) .to eq(long_array.take(3) + ['...']) end end end end end