# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'client' do
  context 'with specific architecture' do
    it 'allows module-based interfaces' do
      class ModuleClient
        include Cistern::Client.with(interface: :module)
      end

      class ModuleClient::Shoot
        include ModuleClient::Request

        def real(mod)
          mod % 9
        end
      end

      class ModuleClient::Moon
        include ModuleClient::Model

        identity :on

        def save
          identity % 3
        end
      end

      class ModuleClient::Moons
        include ModuleClient::Collection

        model ModuleClient::Moon
      end

      expect(
        ModuleClient.new.shoot(12)
      ).to eq(3)

      expect(ModuleClient.collections).to contain_exactly(ModuleClient::Moons)
      expect(ModuleClient.models).to contain_exactly(ModuleClient::Moon)
      expect(ModuleClient.requests).to contain_exactly(ModuleClient::Shoot)

      expect(
        ModuleClient.new.moons.new(on: 5).save
      ).to eq(2)
    end

    it 'allows custom model interface' do
      class AskClient
        include Cistern::Client.with(model: 'Ask', interface: :module)
      end

      class AskClient::Model
        include AskClient::Ask

        identity :id

        def save
          9 % identity
        end
      end

      expect(
        AskClient.new.model(id: 9).save
      ).to eq(0)
    end
  end
end
