This repository has been archived on 2024-06-24. You can view files and clone it, but cannot push or open issues or pull requests.
ace-of-base/spec/ace_of_base/record_spec.rb
2019-07-10 21:03:07 +12:00

255 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