require "test_helper"

module Admin
  class GroupsControllerTest < ActionDispatch::IntegrationTest
    setup do
      @admin = users(:two)
      sign_in_as(@admin)
      @group = groups(:one)
    end

    test "update assigns applications from application_ids" do
      app_a = applications(:kavita_app)
      app_b = applications(:another_app)

      patch admin_group_path(@group), params: {
        group: {
          name: @group.name,
          application_ids: [app_a.id, app_b.id]
        }
      }

      assert_redirected_to admin_group_path(@group)
      assert_equal [app_a, app_b].sort, @group.reload.applications.sort
    end

    test "update with no application_ids clears assigned applications" do
      @group.applications = [applications(:kavita_app)]

      patch admin_group_path(@group), params: {
        group: {name: @group.name}
      }

      assert_redirected_to admin_group_path(@group)
      assert_empty @group.reload.applications
    end

    test "create assigns applications from application_ids" do
      app = applications(:audiobookshelf_app)

      assert_difference -> { Group.count }, 1 do
        post admin_groups_path, params: {
          group: {
            name: "New Group",
            application_ids: [app.id]
          }
        }
      end

      assert_equal [app], Group.find_by(name: "new group").applications
    end

    test "can mark a group as auto_assign and admin" do
      patch admin_group_path(@group), params: {
        group: {name: @group.name, auto_assign: "1", admin: "1"}
      }

      @group.reload
      assert @group.auto_assign?
      assert @group.admin?
    end

    test "cannot delete the last admin group" do
      admins = groups(:admin_group)

      delete admin_group_path(admins)
      # Destroy was aborted by the before_destroy guard
      assert Group.exists?(admins.id), "admin group should not have been deleted"
    end
  end
end
