require 'helper'
require 'fluent/plugin/norikra_target'

class TargetTest < Test::Unit::TestCase
  def setup
    @this = Fluent::NorikraOutput::Target
  end

  def test_instanciate
        q1 = Fluent::Config::Element.new('query', nil, {
        'name' => 'q1_${target}',
        'expression' => 'SELECT * FROM ${target}.win:time_batch(10 min) WHERE q1',
        'tag' => 'q1.${target}'
      }, [])
    q2 = Fluent::Config::Element.new('query', nil, {
        'name' => 'q2_${target}',
        'expression' => 'SELECT * FROM ${target}.win:time_batch(50 min) WHERE q2.length() > 0',
        'tag' => 'q2.${target}'
      }, [])
    c1 = Fluent::Config::Element.new('default', nil, {
        'include' => '*',
        'exclude' => 'flag',
        'exclude_regexp' => 'f_.*',
        'field_string' => 's1,s2,s3',
        'field_boolean' => 'bool1,bool2',
        'field_int' => 'i1,i2,i3,i4',
        'field_long' => 'num1,num2',
        'field_float' => 'f1,f2',
        'field_double' => 'd'
      }, [q1,q2])
    s1 = Fluent::NorikraOutput::ConfigSection.new(c1)

    q3 = Fluent::Config::Element.new('query', nil, {
        'name' => 'q3_test',
        'expression' => 'SELECT * FROM ${target}.win:time_batch(30 min) WHERE q3="/"',
        'tag' => 'q3.test'
      }, [])
    c2 = Fluent::Config::Element.new('target', 'test', {
        'exclude_regexp' => '(f|g)_.*',
        'field_double' => 'd1,d2,d3,d4'
      }, [q3])
    s2 = Fluent::NorikraOutput::ConfigSection.new(c2)

    t = @this.new('test', s1 + s2)

    assert_equal 'test', t.name
    assert_equal({
        :string => %w(s1 s2 s3), :boolean => %w(bool1 bool2), :int => %w(i1 i2 i3 i4), :long => %w(num1 num2),
        :float => %w(f1 f2), :double => %w(d d1 d2 d3 d4)
      }, t.fields)
    assert_equal 3, t.queries.size

    r = t.filter({'x'=>1,'y'=>'y','z'=>'zett','flag'=>true,'f_x'=>'true','g_1'=>'g'})
    assert_equal 3, r.size
    assert_equal({'x'=>1,'y'=>'y','z'=>'zett'}, r)

    # reserve_fields
    assert_equal({
        's1' => 'string', 's2' => 'string', 's3' => 'string',
        'bool1' => 'boolean', 'bool2' => 'boolean',
        'i1' => 'int', 'i2' => 'int', 'i3' => 'int', 'i4' => 'int', 'num1' => 'long', 'num2' => 'long',
        'f1' => 'float', 'f2' => 'float',
        'd' => 'double', 'd1' => 'double', 'd2' => 'double', 'd3' => 'double', 'd4' => 'double'
      }, t.reserve_fields)
  end
end