# frozen_string_literal: true require 'spec_helper' require 'securerandom' RSpec.describe AceOfBase::Record do let(:project) { 'Back To The Future' } let(:shot) { '03' } let(:version) { '32' } let(:status) { 'finished' } let(:finish_date) { '1985-10-26' } let(:internal_bid) { '1.21' } let(:created_date) { '1985-10-26 01:22' } let(:row) { [project, shot, version, status, finish_date, internal_bid, created_date] } subject { described_class.new(row) } describe '#project' do subject { super().project } it { is_expected.to eq(project) } end describe '#shot' do subject { super().shot } it { is_expected.to eq('03') } end describe '#version' do subject { super().version } it { is_expected.to eq(32) } end describe '#status' do subject { super().status } it { is_expected.to eq('finished') } end describe '#finish_date' do subject { super().finish_date } it { is_expected.to eq(Date.civil(1985, 10, 26)) } end describe '#internal_bid' do subject { super().internal_bid } it { is_expected.to eq(1.21) } end describe '#created_date' do subject { super().created_date } it { is_expected.to eq DateTime.civil(1985, 10, 26, 1, 22, 0) } end describe '#valid?' do subject { super().valid? } it { is_expected.to be true } end describe '#errors' do subject { super().errors } it { is_expected.to be_empty } end describe '<=>' do let(:other) { described_class.new(other_row) } subject { super() <=> other } context 'When both rows contain the same data' do let(:other_row) { row } it { is_expected.to eq(0) } end context 'When one of our fields is less than the other' do let(:other_row) { row.dup.tap { |r| r[2] = '48' } } it { is_expected.to eq(-1) } end context 'When one of our fields is greater than the other' do let(:other_row) { row.dup.tap { |r| r[4] = '1885-01-01' } } it { is_expected.to eq(1) } end end context 'When the project name is longer than 64 characters' do let(:project) do "Back To The Future III: They've saved the best trip for last..." \ 'But this time they may have gone too far.' end describe '#project' do subject { super().project } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/over the maximum length/) } end end context 'When the shot name is longer than 64 characters' do let(:shot) { SecureRandom.hex(128) } describe '#shot' do subject { super().shot } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/over the maximum length/) } end end context 'When the version number is less than zero' do let(:version) { '-1' } describe '#version' do subject { super().version } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/outside the range/) } end end context 'When the version number is greater than 65535' do let(:version) { '65536' } describe '#version' do subject { super().version } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/outside the range/) } end end context 'When the status is longer than 32 characters' do let(:status) { SecureRandom.hex(128) } describe '#status' do subject { super().status } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/over the maximum length/) } end end context 'When the finish date not a correctly formatted date' do let(:finish_date) { 'YYYY-MM-DD' } describe '#finish_date' do subject { super().finish_date } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/unable to parse date/) } end end context 'When the internal bid is less than zero' do let(:internal_bid) { '-0.5' } describe '#internal_bid' do subject { super().internal_bid } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/outside the range/) } end end context 'When the internal bid is greater than 65535' do let(:internal_bid) { '65_535.1' } describe '#internal_bid' do subject { super().internal_bid } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/outside the range/) } end end context 'When the created date is not in the correct date and time format' do let(:created_date) { 'YYYY-MM-DD HH:mm' } describe '#created_date' do subject { super().created_date } it { is_expected.to be nil } end describe '#valid?' do subject { super().valid? } it { is_expected.to be false } end describe '#errors' do subject { super().errors } it { is_expected.to include(/unable to parse date/) } end end end