require 'spec_helper' require 'flydata/table_def' module Flydata module TableDef describe RedshiftTableDef do describe '.column_def_sql' do let(:column) { {} } subject { described_class.column_def_sql(column) } context 'with varchar column def' do context 'when size is smaller than max size' do let(:column) { {:name=>"col_char", :type=>"varchar(18)", :default=>nil} } it do expect(subject).to eq(' "col_char" varchar(18) DEFAULT NULL') end end context 'when size exceeds varchar max size' do let(:column) { {:name=>"col_char", :type=>"varchar(1000000000)", :default=>nil} } it do expect(subject).to eq(' "col_char" varchar(65535) DEFAULT NULL') end end context 'when size is max size' do let(:column) { {:name=>"col_char", :type=>"varchar(max)", :default=>nil} } it do expect(subject).to eq(' "col_char" varchar(max) DEFAULT NULL') end end end context 'with medium blob column def' do context 'when size exceeds max size' do let(:column) { {:name=>"col_medium_blob", :type=>"varbinary(16777215)", :default=>nil} } it do expect(subject).to eq(' "col_medium_blob" varchar(65535) DEFAULT NULL') end end end context 'with unsigned column def' do let(:column) { {:name=>"value_small_int", :type=>"int2(5) unsigned", :default=>nil} } it do expect(subject).to eq(' "value_small_int" int4 DEFAULT NULL') end end context 'with decimal column def' do context 'when precision exceeds max allowed' do let(:column) { {:name=>"value", :type=>"numeric(65,30)", :default=>nil} } it 'should replace precision with max value' do expect(subject).to eq(' "value" numeric(38,30) DEFAULT NULL') end end context 'when scale exceeds max allowed' do #not possible let(:column) { {:name=>"value", :type=>"numeric(45,44)", :default=>nil} } it 'should replace scale with max value' do expect(subject).to eq(' "value" numeric(38,37) DEFAULT NULL') end end context 'when precision and scale exceeds max allowed (for unsigned)' do let(:column) { {:name=>"value", :type=>"numeric(65,44) unsigned", :default=>nil} } it 'should replace precision with max value' do expect(subject).to eq(' "value" numeric(38,37) DEFAULT NULL') end end context 'when precision and scale are within limit (for unsigned)' do let(:column) { {:name=>"value", :type=>"numeric(37,29) unsigned", :default=>nil} } it 'should do nothing' do expect(subject).to eq(' "value" numeric(37,29) DEFAULT NULL') end end end end end end end