require_relative '../../../../lib/carto/db/sanitize.rb'

module Carto
  module DB
    module Sanitize
      describe '#sanitize_identifier' do
        it 'should prepend table_ to identifiers starting with numbers' do
          identifier = '13102016manolo'
          sanitized_identifier = 'table_13102016manolo'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should prepend table_ to identifiers starting with _' do
          identifier = '_manolo'
          sanitized_identifier = 'table_manolo'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should strip whitespaces' do
          identifier = '                  manolo             '
          sanitized_identifier = 'manolo'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should remove repated _' do
          identifier = 'manolo___________escobar'
          sanitized_identifier = 'manolo_escobar'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should convert to lowercase' do
          identifier = 'MaNoLo'
          sanitized_identifier = 'manolo'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should replace whitespaces with _' do
          identifier = 'manolo escobar'
          sanitized_identifier = 'manolo_escobar'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should replace disallowed characters with _' do
          identifier = 'mañolo!#^èscœbar'
          sanitized_identifier = 'ma_olo_sc_bar'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should do all together' do
          identifier = '!#_   where'
          sanitized_identifier = 'table_where'

          Carto::DB::Sanitize.sanitize_identifier(identifier).should eq sanitized_identifier
        end

        it 'should append _t to identifiers that are RESERVED_WORDS' do
          Carto::DB::Sanitize::RESERVED_WORDS.each do |reserved_word_identifier|
            sanitized_identifier = reserved_word_identifier + '_t'

            Carto::DB::Sanitize.sanitize_identifier(reserved_word_identifier).should eq sanitized_identifier
          end
        end

        it 'should append _t to identifiers that are RESERVED_TABLE_NAMES' do
          Carto::DB::Sanitize::RESERVED_TABLE_NAMES.each do |reserved_word_identifier|
            sanitized_identifier = reserved_word_identifier + '_t'

            Carto::DB::Sanitize.sanitize_identifier(reserved_word_identifier).should eq sanitized_identifier
          end
        end

        it 'should append _t to identifiers that are SYSTEM_TABLE_NAMES' do
          Carto::DB::Sanitize::SYSTEM_TABLE_NAMES.each do |reserved_word_identifier|
            sanitized_identifier = reserved_word_identifier + '_t'

            Carto::DB::Sanitize.sanitize_identifier(reserved_word_identifier).should eq sanitized_identifier
          end
        end
      end

      describe '#append_with_truncate_and_sanitize' do
        it 'should append when length is normal' do
          identifier = 'manolo'
          suffix = '_escobar'

          appended_and_truncated = 'manolo_escobar'

          Carto::DB::Sanitize.append_with_truncate_and_sanitize(identifier, suffix).should eq appended_and_truncated
        end

        it 'should append when identifier is too long' do
          identifier = 'manolo' * 12
          suffix = '_escobar'

          Carto::DB::Sanitize.append_with_truncate_and_sanitize(identifier, suffix).end_with?(suffix).should be_true
        end

        it 'should raise when suffix is too long' do
          identifier = 'manolo' * 12

          expect { Carto::DB::Sanitize.append_with_truncate_and_sanitize(identifier, identifier) }.to raise_error
        end
      end
    end
  end
end
