require 'ostruct'
require 'spec_helper'
require_worker 'instance_worker'

module RCS
  module Worker
    describe FilesystemEvidenceMixin do

      silence_alerts
      enable_license
      evidence_no_conflict

      describe '#detect_updated_path' do

        def klass(agent)
          open_struct = OpenStruct.new(agent: agent)
          open_struct.singleton_class.send(:include, described_class)
          open_struct
        end

        def paths_to_entries(paths)
          paths.map { |p| {path: p} }
        end

        context 'with unix filesystem' do

          let(:agent) { factory_create(:agent, platform: 'linux') }

          let(:subject) { klass(agent) }

          before do
            described_class.stub(:agent).and_return(agent)
          end

          it 'returns expected path' do
            subject.stub(:entries).and_return paths_to_entries %w[/usr /usr/foo /usr/bar]
            expect(subject.detect_updated_path).to eq('/usr')

            subject.stub(:entries).and_return paths_to_entries %w[/usr/ /usr/foo /usr/bar]
            expect(subject.detect_updated_path).to eq('/usr')

            subject.stub(:entries).and_return paths_to_entries %w[/usr]
            expect(subject.detect_updated_path).to eq('/usr')

            subject.stub(:entries).and_return paths_to_entries %w[/usr /]
            expect(subject.detect_updated_path).to eq('/')

            subject.stub(:entries).and_return paths_to_entries %w[/usr/ /]
            expect(subject.detect_updated_path).to eq('/')

            subject.stub(:entries).and_return paths_to_entries %w[/usr/]
            expect(subject.detect_updated_path).to eq('/usr/')

            subject.stub(:entries).and_return paths_to_entries %w[/]
            expect(subject.detect_updated_path).to eq('/')
          end
        end

        context 'with windows filesystem' do

          let(:agent) { factory_create(:agent, platform: 'windows') }

          let(:subject) { klass(agent) }

          before do
            described_class.stub(:agent).and_return(agent)
          end

          it 'returns expected path' do
            subject.stub(:entries).and_return paths_to_entries %w[c:]
            expect(subject.detect_updated_path).to eq('c:')

            subject.stub(:entries).and_return paths_to_entries %w[c:\\]
            expect(subject.detect_updated_path).to eq('c:\\')

            subject.stub(:entries).and_return paths_to_entries %w[c: c:\\foo]
            expect(subject.detect_updated_path).to eq('c:')

            subject.stub(:entries).and_return paths_to_entries %w[c:\\ c:\\foo]
            expect(subject.detect_updated_path).to eq('c:')

            subject.stub(:entries).and_return paths_to_entries %w[c:\\foo\\bar c:\\foo]
            expect(subject.detect_updated_path).to eq('c:\\foo')

            subject.stub(:entries).and_return paths_to_entries %w[c:\\foo\\bar c:\\foo\\]
            expect(subject.detect_updated_path).to eq('c:\\foo')
          end
        end
      end
    end
  end
end
