require_relative '../spec_helper'
require 'sql/maker'

describe 'SQL::Maker' do
  context 'auto bind' do
    let(:builder) { SQL::Maker.new(:driver => 'mysql', :auto_bind => true) }

    it 'delete' do
      sql = builder.delete('foo', {:bar => "t' OR 't' = 't"})
      expect(sql).to be == %q{DELETE FROM `foo` WHERE (`bar` = 't'' OR ''t'' = ''t')}
    end

    it 'insert' do
      sql = builder.insert('foo', {:bar => "t' OR 't' = 't"})
      expect(sql).to be == %Q{INSERT INTO `foo`\n(`bar`)\nVALUES ('t'' OR ''t'' = ''t')}
    end

    it 'select' do
      sql = builder.select('foo', ['foo'], { :bar => "t' OR 't' = 't" })
      expect(sql).to be == %Q{SELECT `foo`\nFROM `foo`\nWHERE (`bar` = 't'' OR ''t'' = ''t')}
    end

    it 'update' do
      sql = builder.update('foo', {:bar => "t' OR 't' = 't"})
      expect(sql).to be == %Q{UPDATE `foo` SET `bar` = 't'' OR ''t'' = ''t'}
    end
  end

  context '#bind_param' do
    let(:builder) { SQL::Maker.new(:driver => 'mysql', :auto_bind => false) }

    it 'delete' do
      sql, bind = builder.delete('foo', {:bar => "t' OR 't' = 't"})
      sql = builder.bind_param(sql, bind)
      expect(sql).to be == %q{DELETE FROM `foo` WHERE (`bar` = 't'' OR ''t'' = ''t')}
    end
  end

  context 'hash arguments' do
    let(:builder) { SQL::Maker.new(:driver => 'mysql', :auto_bind => true) }

    it 'delete' do
      sql = builder.delete(table: 'foo', where: {:bar => "t' OR 't' = 't"})
      expect(sql).to be == %q{DELETE FROM `foo` WHERE (`bar` = 't'' OR ''t'' = ''t')}
    end

    it 'insert' do
      sql = builder.insert(table: 'foo', values: {:bar => "t' OR 't' = 't"})
      expect(sql).to be == %Q{INSERT INTO `foo`\n(`bar`)\nVALUES ('t'' OR ''t'' = ''t')}
    end

    it 'select' do
      sql = builder.select(table: 'foo', fields: ['foo'], where: { :bar => "t' OR 't' = 't" })
      expect(sql).to be == %Q{SELECT `foo`\nFROM `foo`\nWHERE (`bar` = 't'' OR ''t'' = ''t')}
    end

    it 'update' do
      sql = builder.update(table: 'foo', set: {:bar => "t' OR 't' = 't"})
      expect(sql).to be == %Q{UPDATE `foo` SET `bar` = 't'' OR ''t'' = ''t'}
    end
  end
end