# frozen_string_literal: true

require 'spec_helper'
require 'tempfile'

require './lib/fusuma/config'
require './lib/fusuma/plugin/filters/filter'
require './lib/fusuma/plugin/events/event'

module Fusuma
  module Plugin
    module Filters
      class DummyFilter < Filter
        DEFAULT_SOURCE = 'dummy_input'

        def config_param_types
          {
            source: String
          }
        end
      end

      RSpec.describe DummyFilter do
        let(:filter) { DummyFilter.new }

        describe '#source' do
          subject { filter.source }

          it { is_expected.to eq DummyFilter::DEFAULT_SOURCE }

          context 'with config' do
            around do |example|
              @custom_source = 'custom_input'

              ConfigHelper.load_config_yml = <<~CONFIG
                plugin:
                 filters:
                   dummy_filter:
                     source: #{@custom_source}
              CONFIG

              example.run

              Config.custom_path = nil
            end

            it { is_expected.to eq @custom_source }
          end
        end

        describe '#filter' do
          subject { filter.filter(event) }
          let(:event) { Events::Event.new(tag: 'dummy_input', record: 'dummy') }

          context 'when filter#keep? return false' do
            before do
              allow(filter).to receive(:keep?).and_return(false)
            end

            it { is_expected.to be nil }
          end

          context 'when filter#keep? return true' do
            before do
              allow(filter).to receive(:keep?).and_return(true)
            end

            it { is_expected.to be event }
          end
        end

        describe '#config_params' do
          around do |example|
            ConfigHelper.load_config_yml = <<~CONFIG
              plugin:
               filters:
                 dummy_filter:
                   dummy: dummy
            CONFIG

            example.run

            Config.custom_path = nil
          end

          subject { filter.config_params }
          it { is_expected.to eq(dummy: 'dummy') }
        end
      end
    end
  end
end