256 lines
6 KiB
Ruby
256 lines
6 KiB
Ruby
|
# 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
|