# frozen_string_literal: true

require 'spec_helper'

describe 'mock data' do
  before {
    class Sample::Diagnosis < Sample::Request
      def real(diagnosis)
      end

      def mock(diagnosis)
        cistern.data.store(:diagnosis, cistern.data.fetch(:diagnosis) + [diagnosis])
      end
    end

    class Sample::Treat < Sample::Request
      def real(treatment)
      end

      def mock(treatment)
        cistern.data[:treatments] += [treatment]
      end
    end
  }

  shared_examples 'mock_data#backend' do |backend, options|
    it 'should store mock data' do
      Sample.mock!
      Sample::Mock.store_in(backend, options)
      Sample.reset!

      p = Sample.new
      p.diagnosis('sick')
      expect(p.data[:diagnosis]).to eq(['sick'])

      p.reset!

      expect(p.data[:diagnosis]).to eq([])

      p.treat('healthy')
      expect(p.data[:treatments]).to eq(['healthy'])

      Sample.reset!

      expect(p.data[:treatments]).to eq([])
    end
  end

  context 'with a storage backend' do
    describe 'Cistern::Data::Hash' do
      include_examples 'mock_data#backend', :hash
    end

    if ENV.key?('REDIS_URI')
      describe 'Cistern::Data::Redis' do
        include_examples 'mock_data#backend', :redis

        context 'with an explicit client' do
          before(:each) do
            @other = Redis::Namespace.new('other_cistern', Redis.new)
            @other.set('x', 'y')
          end

          include_examples 'mock_data#backend', :redis, client: Redis::Namespace.new('cistern', Redis.new)

          after(:each) do
            expect(@other.get('x')).to eq('y')
            @other.del('x')
          end
        end
      end
    end
  end
end
