// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/cast_receiver/browser/permissions_manager_impl.h"

#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
#include "url/gurl.h"

namespace cast_receiver {

// TODO(crbug.com/40236247): Add tests for ApplicationStateObserver.
class PermissionsManagerImplTest : public testing::Test {
 public:
  PermissionsManagerImplTest()
      : app_url_("https://www.netflix.com"), permissions_manager_(kAppId) {
    permissions_manager_.AddOrigin(url::Origin::Create(app_url_));
  }
  ~PermissionsManagerImplTest() override = default;

  bool HasPermission(blink::PermissionType permission, const GURL& origin) {
    return permissions_manager_.GetPermissionStatus(permission, origin) ==
           blink::mojom::PermissionStatus::GRANTED;
  }

 protected:
  const std::string kAppId = "app id";
  const GURL app_url_;

  PermissionsManagerImpl permissions_manager_;
};

TEST_F(PermissionsManagerImplTest, Test) {
  const GURL http_url("http://www.netflix.com");
  const GURL sub_url("https://www.netflix.com/some/tv/show");
  const GURL other_url("http://www.amazon.com");
  EXPECT_EQ(kAppId, permissions_manager_.GetAppId());

  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, app_url_));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, http_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, sub_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, other_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::MIDI, app_url_));
  EXPECT_FALSE(
      HasPermission(blink::PermissionType::PERSISTENT_STORAGE, app_url_));

  permissions_manager_.AddPermission(blink::PermissionType::NOTIFICATIONS);
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, app_url_));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, http_url));
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, sub_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, other_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::MIDI, app_url_));
  EXPECT_FALSE(
      HasPermission(blink::PermissionType::PERSISTENT_STORAGE, app_url_));

  permissions_manager_.AddOrigin(url::Origin::Create(http_url));
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, app_url_));
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, http_url));
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, sub_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, other_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::MIDI, app_url_));
  EXPECT_FALSE(
      HasPermission(blink::PermissionType::PERSISTENT_STORAGE, app_url_));

  permissions_manager_.AddPermission(blink::PermissionType::MIDI);
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, app_url_));
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, http_url));
  EXPECT_TRUE(HasPermission(blink::PermissionType::NOTIFICATIONS, sub_url));
  EXPECT_FALSE(HasPermission(blink::PermissionType::NOTIFICATIONS, other_url));
  EXPECT_TRUE(HasPermission(blink::PermissionType::MIDI, app_url_));
  EXPECT_FALSE(
      HasPermission(blink::PermissionType::PERSISTENT_STORAGE, app_url_));
}

}  // namespace cast_receiver
