2019-12-21 20:55:43 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-07-28 23:09:34 +05:30
|
|
|
RSpec.describe Gitlab::Ci::Ansi2json::Line do
|
2019-12-21 20:55:43 +05:30
|
|
|
let(:offset) { 0 }
|
|
|
|
let(:style) { Gitlab::Ci::Ansi2json::Style.new }
|
|
|
|
|
|
|
|
subject { described_class.new(offset: offset, style: style) }
|
|
|
|
|
|
|
|
describe '#<<' do
|
|
|
|
it 'appends new data to the current segment' do
|
|
|
|
expect { subject << 'test 1' }.to change { subject.current_segment.text }
|
|
|
|
expect(subject.current_segment.text).to eq('test 1')
|
|
|
|
|
|
|
|
expect { subject << ', test 2' }.to change { subject.current_segment.text }
|
|
|
|
expect(subject.current_segment.text).to eq('test 1, test 2')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#style' do
|
|
|
|
context 'when style is passed to the initializer' do
|
|
|
|
let(:style) { double }
|
|
|
|
|
|
|
|
it 'returns the same style' do
|
|
|
|
expect(subject.style).to eq(style)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when style is not passed to the initializer' do
|
|
|
|
it 'returns the default style' do
|
|
|
|
expect(subject.style.set?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#update_style' do
|
|
|
|
let(:expected_style) do
|
|
|
|
Gitlab::Ci::Ansi2json::Style.new(
|
|
|
|
fg: 'term-fg-l-yellow',
|
|
|
|
bg: 'term-bg-blue',
|
|
|
|
mask: 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'sets the style' do
|
|
|
|
subject.update_style(%w[1 33 44])
|
|
|
|
|
|
|
|
expect(subject.style).to eq(expected_style)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#add_section' do
|
|
|
|
it 'appends a new section to the list' do
|
|
|
|
subject.add_section('section_1')
|
|
|
|
subject.add_section('section_2')
|
|
|
|
|
|
|
|
expect(subject.sections).to eq(%w[section_1 section_2])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-01-03 14:25:43 +05:30
|
|
|
describe '#set_section_options' do
|
|
|
|
it 'sets the current section\'s options' do
|
|
|
|
options = { collapsed: true }
|
|
|
|
subject.set_section_options(options)
|
|
|
|
|
|
|
|
expect(subject.to_h[:section_options]).to eq(options)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-12-21 20:55:43 +05:30
|
|
|
describe '#set_as_section_header' do
|
|
|
|
it 'change the section_header to true' do
|
|
|
|
expect { subject.set_as_section_header }
|
|
|
|
.to change { subject.section_header }
|
|
|
|
.to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#set_section_duration' do
|
2021-09-30 23:02:18 +05:30
|
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
|
|
|
|
where(:duration, :result) do
|
|
|
|
nil | '00:00'
|
|
|
|
'string' | '00:00'
|
|
|
|
0.seconds | '00:00'
|
|
|
|
7.seconds | '00:07'
|
|
|
|
75 | '01:15'
|
|
|
|
1.minute + 15.seconds | '01:15'
|
|
|
|
13.hours + 14.minutes + 15.seconds | '13:14:15'
|
|
|
|
1.day + 13.hours + 14.minutes + 15.seconds | '37:14:15'
|
2022-10-02 17:18:49 +05:30
|
|
|
Float::MAX | '8765:00:00'
|
|
|
|
10**10000 | '8765:00:00'
|
2021-09-04 01:27:46 +05:30
|
|
|
end
|
|
|
|
|
2021-09-30 23:02:18 +05:30
|
|
|
with_them do
|
|
|
|
it do
|
|
|
|
subject.set_section_duration(duration)
|
2021-09-04 01:27:46 +05:30
|
|
|
|
2021-09-30 23:02:18 +05:30
|
|
|
expect(subject.section_duration).to eq(result)
|
2021-09-04 01:27:46 +05:30
|
|
|
end
|
2019-12-21 20:55:43 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#flush_current_segment!' do
|
|
|
|
context 'when current segment is not empty' do
|
|
|
|
before do
|
|
|
|
subject << 'some data'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'adds the segment to the list' do
|
|
|
|
expect { subject.flush_current_segment! }.to change { subject.segments.count }.by(1)
|
|
|
|
|
|
|
|
expect(subject.segments.map { |s| s[:text] }).to eq(['some data'])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'updates the current segment pointer propagating the style' do
|
|
|
|
previous_segment = subject.current_segment
|
|
|
|
|
|
|
|
subject.flush_current_segment!
|
|
|
|
|
|
|
|
expect(subject.current_segment).not_to eq(previous_segment)
|
|
|
|
expect(subject.current_segment.style).to eq(previous_segment.style)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when current segment is empty' do
|
|
|
|
it 'does not add any segments to the list' do
|
|
|
|
expect { subject.flush_current_segment! }.not_to change { subject.segments.count }
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not change the current segment' do
|
|
|
|
expect { subject.flush_current_segment! }.not_to change { subject.current_segment }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#to_h' do
|
|
|
|
before do
|
|
|
|
subject << 'some data'
|
|
|
|
subject.update_style(['1'])
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when sections are present' do
|
|
|
|
before do
|
|
|
|
subject.add_section('section_1')
|
|
|
|
subject.add_section('section_2')
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when section header is set' do
|
|
|
|
before do
|
|
|
|
subject.set_as_section_header
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'serializes the attributes set' do
|
|
|
|
result = {
|
|
|
|
offset: 0,
|
|
|
|
content: [{ text: 'some data', style: 'term-bold' }],
|
|
|
|
section: 'section_2',
|
|
|
|
section_header: true
|
|
|
|
}
|
|
|
|
|
|
|
|
expect(subject.to_h).to eq(result)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when section duration is set' do
|
|
|
|
before do
|
|
|
|
subject.set_section_duration(75)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'serializes the attributes set' do
|
|
|
|
result = {
|
|
|
|
offset: 0,
|
|
|
|
content: [{ text: 'some data', style: 'term-bold' }],
|
|
|
|
section: 'section_2',
|
|
|
|
section_duration: '01:15'
|
|
|
|
}
|
|
|
|
|
|
|
|
expect(subject.to_h).to eq(result)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there are no sections' do
|
|
|
|
it 'serializes the attributes set' do
|
|
|
|
result = {
|
|
|
|
offset: 0,
|
|
|
|
content: [{ text: 'some data', style: 'term-bold' }]
|
|
|
|
}
|
|
|
|
|
|
|
|
expect(subject.to_h).to eq(result)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|