require 'flydata-core/postgresql/source_pos' module FlydataCore module Postgresql describe SourcePos do let(:subject_object) { described_class.new(snapshot, to_snapshot, pk_values) } let(:snapshot) { "1234:1234:" } let(:to_snapshot) { nil } let(:pk_values) { nil } describe '#initialize' do context 'with snapshot and pk_values' do it { expect(subject_object.snapshot).to eq(Snapshot.new(snapshot)) } it { expect(subject_object.pk_values).to eq(pk_values) } end context 'with source pos object' do let(:snapshot) { '1111:1111:' } let(:to_snapshot) { '2222:2222:' } let(:pk_values) { [{'id' => '1000'}] } let(:obj) { described_class.new(snapshot, to_snapshot, pk_values) } subject { described_class.new(obj) } it { expect(subject.snapshot).to eq(Snapshot.new(snapshot)) } it { expect(subject.to_snapshot).to eq(Snapshot.new(to_snapshot)) } it { expect(subject.pk_values).to eq(pk_values) } end end describe '#to_s' do subject { subject_object.to_s } context 'when pk_values is nil' do let(:pk_values) { nil } it { is_expected.to eq %Q|#{snapshot}\t\t| } end context 'when pk_values is not nil' do let(:to_snapshot) { '1234:1234:' } let(:pk_values) { { "user_id" => 1, "address_id" => 3 } } it { is_expected.to eq %Q|#{snapshot}\t#{to_snapshot}\t{"user_id":1,"address_id":3}| } end end describe '.load' do subject { described_class.load(str) } context 'without pk_values' do let(:str) { %Q|#{snapshot}\t\t| } it { is_expected.to eq described_class.new(snapshot) } end context 'with pk_values' do let(:str) { %Q|#{snapshot}\t\t{"user_id":1,"address_id":3}| } it do is_expected.to eq described_class.new(snapshot, nil, "user_id" => 1, "address_id" => 3) end end end describe '#<=>' do def src_pos(snapshot, pk_values = nil) described_class.new(snapshot, '2222:2222:', pk_values) end context 'when both have no pk_values' do it { expect(src_pos('1111:1111:') == src_pos('1111:1111:')).to be(true) } it { expect(src_pos('1111:1111:') == src_pos('1112:1112:')).to be(false) } it { expect(src_pos('1111:1111:') < src_pos('1112:1112:')).to be(true) } it { expect(src_pos('1111:1111:') < src_pos('1110:1110:')).to be(false) } it { expect(src_pos('1111:1111:') > src_pos('1110:1110:')).to be(true) } it { expect(src_pos('1111:1111:') > src_pos('1112:1112:')).to be(false) } it { expect(src_pos('1111:1111:') > src_pos('999:999')).to be(true) } end context 'when one of them has pk_values' do let(:pkv) { [{'id'=>'10'}] } it { expect(src_pos('1111:1111:',pkv) == src_pos('1111:1111:')).to be(false) } it { expect(src_pos('1111:1111:',pkv) == src_pos('1112:1112:')).to be(false) } it { expect(src_pos('1111:1111:',pkv) < src_pos('1111:1111:')).to be(true) } it { expect(src_pos('1111:1111:',pkv) < src_pos('1112:1112:')).to be(true) } it { expect(src_pos('1111:1111:',pkv) < src_pos('1110:1110:')).to be(false) } it { expect(src_pos('1111:1111:',pkv) > src_pos('1110:1110:')).to be(true) } it { expect(src_pos('1111:1111:',pkv) > src_pos('1112:1112:')).to be(false) } end context 'when both have pk_values' do let(:pkv1) { [{'id'=>'10'}] } let(:pkv2) { [{'name'=>'akira'}] } it { expect(src_pos('1111:1111:',pkv1) == src_pos('1111:1111:',pkv1)).to be(true) } it { expect(src_pos('1111:1111:',pkv1) == src_pos('1111:1111:',pkv2)).to be(false) } it { expect(src_pos('1111:1111:',pkv1) == src_pos('1112:1112:',pkv2)).to be(false) } it { expect(src_pos('1111:1111:',pkv1) < src_pos('1111:1111:',pkv2)).to be(true) } it { expect(src_pos('1111:1111:',pkv1) < src_pos('1111:1111:',pkv1)).to be(false) } it { expect(src_pos('1111:1111:',pkv1) < src_pos('1112:1112:',pkv2)).to be(true) } it { expect(src_pos('1111:1111:',pkv1) < src_pos('1110:1110:',pkv2)).to be(false) } it { expect(src_pos('1111:1111:',pkv1) > src_pos('1110:1110:',pkv2)).to be(true) } it { expect(src_pos('1111:1111:',pkv1) > src_pos('1112:1112:',pkv2)).to be(false) } it { expect(src_pos('1111:1111:',pkv1) > src_pos('1111:1111:',pkv2)).to be(false) } end end end end end