# Copyright (C) 2024 Manuel Bustillo

require 'rails_helper'

module Groups
  RSpec.describe SummaryQuery do
    describe '#call' do
      subject { described_class.new.call }

      context 'when there are no groups' do
        it { is_expected.to eq([]) }
      end

      context 'when groups are defined' do
        let!(:parent) { create(:group, name: 'Friends', icon: 'icon-1', color: '#FF0000') }
        let!(:child) { create(:group, name: 'Family', icon: 'icon-2', color: '#00FF00', parent:) }

        context 'when there are no guests' do
          it 'returns the summary of groups' do
            is_expected.to contain_exactly(
              { 'id' => parent.id,
                'name' => 'Friends',
                'icon' => 'icon-1',
                'parent_id' => nil,
                'color' => '#FF0000',
                'total' => 0,
                'considered' => 0,
                'invited' => 0,
                'confirmed' => 0,
                'declined' => 0,
                'tentative' => 0 },
              { 'id' => child.id,
                'name' => 'Family',
                'icon' => 'icon-2',
                'parent_id' => parent.id,
                'color' => '#00FF00',
                'total' => 0,
                'considered' => 0,
                'invited' => 0,
                'confirmed' => 0,
                'declined' => 0,
                'tentative' => 0 }
            )
          end
        end

        context 'when there are guests' do
          before do
            # Parent group
            create_list(:guest, 2, group: parent, status: :considered)
            create_list(:guest, 3, group: parent, status: :invited)
            create_list(:guest, 4, group: parent, status: :confirmed)
            create_list(:guest, 5, group: parent, status: :declined)
            create_list(:guest, 6, group: parent, status: :tentative)

            # Child group
            create_list(:guest, 7, group: child, status: :considered)
            create_list(:guest, 8, group: child, status: :invited)
            create_list(:guest, 9, group: child, status: :confirmed)
            create_list(:guest, 10, group: child, status: :declined)
            create_list(:guest, 11, group: child, status: :tentative)
          end

          it 'returns the summary of groups' do
            is_expected.to contain_exactly(
              {
                'id' => parent.id,
                'name' => 'Friends',
                'icon' => 'icon-1',
                'parent_id' => nil,
                'color' => '#FF0000',
                'total' => 20,
                'considered' => 2,
                'invited' => 3,
                'confirmed' => 4,
                'declined' => 5,
                'tentative' => 6
              },
              {
                'id' => child.id,
                'name' => 'Family',
                'icon' => 'icon-2',
                'parent_id' => parent.id,
                'color' => '#00FF00',
                'total' => 45,
                'considered' => 7,
                'invited' => 8,
                'confirmed' => 9,
                'declined' => 10,
                'tentative' => 11
              }
            )
          end
        end
      end
    end
  end
end