blob: 8f997e32cd9813f38e090eef20dd43fbbadce572 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/download/bubble/download_bubble_utils.h"
#include <string>
#include "chrome/browser/download/bubble/download_bubble_accessible_alerts_map.h"
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_ui_model.h"
#include "components/download/public/common/download_danger_type.h"
#include "components/download/public/common/download_interrupt_reasons.h"
#include "components/download/public/common/mock_download_item.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::ReturnRef;
using ::testing::ReturnRefOfCopy;
using Alert = DownloadBubbleAccessibleAlertsMap::Alert;
using State = download::DownloadItem::DownloadState;
std::unique_ptr<NiceMock<download::MockDownloadItem>> InitDownloadItem(
download::DownloadItem::DownloadState state,
download::DownloadDangerType danger_type =
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) {
auto item = std::make_unique<NiceMock<download::MockDownloadItem>>();
EXPECT_CALL(*item, GetGuid())
.WillRepeatedly(ReturnRefOfCopy(std::string("1")));
EXPECT_CALL(*item, GetFileNameToReportUser())
.WillRepeatedly(
Return(base::FilePath(FILE_PATH_LITERAL("download.pdf"))));
EXPECT_CALL(*item, GetState()).WillRepeatedly(Return(state));
EXPECT_CALL(*item, IsDangerous())
.WillRepeatedly(
Return(danger_type != download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS));
EXPECT_CALL(*item, GetDangerType()).WillRepeatedly(Return(danger_type));
EXPECT_CALL(*item, PercentComplete()).WillRepeatedly(Return(50));
return item;
}
MATCHER_P2(MatchesAlert, alert_substring, urgency, "") {
return arg.text.find(alert_substring) != std::u16string::npos &&
arg.urgency == urgency;
}
MATCHER(AlertIsEmpty, "") {
return arg.text.empty();
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_InProgressNormal) {
auto item = InitDownloadItem(State::IN_PROGRESS);
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert,
MatchesAlert(u"50%", Alert::Urgency::kAlertWhenAppropriate));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_InProgressPaused) {
auto item = InitDownloadItem(State::IN_PROGRESS);
EXPECT_CALL(*item, IsPaused()).WillRepeatedly(Return(true));
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"paused", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_Interrupted) {
auto item = InitDownloadItem(State::INTERRUPTED);
EXPECT_CALL(*item, GetLastReason())
.WillRepeatedly(Return(download::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED));
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"unsuccessful", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_Complete) {
auto item = InitDownloadItem(State::COMPLETE);
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"complete", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_Cancelled) {
auto item = InitDownloadItem(State::CANCELLED);
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"cancelled", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_Dangerous) {
auto item = InitDownloadItem(
State::IN_PROGRESS, download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT);
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"dangerous", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_PromptForScanning) {
auto item = InitDownloadItem(
State::IN_PROGRESS, download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING);
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"scanning", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_DeepScanning) {
auto item = InitDownloadItem(State::IN_PROGRESS,
download::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING);
EXPECT_CALL(*item, IsDangerous()).WillRepeatedly(Return(false));
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert,
MatchesAlert(u"being scanned", Alert::Urgency::kAlertSoon));
}
TEST(DownloadBubbleUtilsTest, GetAccessibleAlertForModel_Insecure) {
auto item = InitDownloadItem(State::IN_PROGRESS);
EXPECT_CALL(*item, IsInsecure()).WillRepeatedly(Return(true));
DownloadItemModel model{
item.get(), std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()};
Alert alert = GetAccessibleAlertForModel(model);
EXPECT_THAT(alert, MatchesAlert(u"can't be downloaded securely",
Alert::Urgency::kAlertSoon));
}
} // namespace