chromium/chrome/browser/ash/release_notes/release_notes_notification_unittest.cc

// Copyright 2019 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/ash/release_notes/release_notes_notification.h"

#include "ash/constants/ash_features.h"
#include "base/feature_list.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "base/version.h"
#include "chrome/browser/notifications/notification_display_service_tester.h"
#include "chrome/browser/notifications/system_notification_helper.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/prefs/testing_pref_service.h"
#include "components/version_info/version_info.h"
#include "ui/chromeos/devicetype_utils.h"

namespace ash {

class ReleaseNotesNotificationTest
    : public BrowserWithTestWindowTest,
      public ::testing::WithParamInterface</*forest_feature=*/bool> {
 public:
  ReleaseNotesNotificationTest() : forest_feature_enabled_(GetParam()) {}

  ReleaseNotesNotificationTest(const ReleaseNotesNotificationTest&) = delete;
  ReleaseNotesNotificationTest& operator=(const ReleaseNotesNotificationTest&) =
      delete;

  ~ReleaseNotesNotificationTest() override = default;

  // BrowserWithTestWindowTest:
  void SetUp() override {
    BrowserWithTestWindowTest::SetUp();
    TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
        std::make_unique<SystemNotificationHelper>());
    tester_ = std::make_unique<NotificationDisplayServiceTester>(nullptr);
    tester_->SetNotificationAddedClosure(
        base::BindRepeating(&ReleaseNotesNotificationTest::OnNotificationAdded,
                            base::Unretained(this)));
    release_notes_notification_ =
        std::make_unique<ReleaseNotesNotification>(profile());
    if (forest_feature_enabled()) {
      scoped_feature_list_.InitWithFeatures(
          /*enabled_features=*/{features::kReleaseNotesNotificationAllChannels,
                                features::kForestFeature},
          /*disabled_features=*/{});
    } else {
      scoped_feature_list_.InitWithFeatures(
          /*enabled_features=*/{features::kReleaseNotesNotificationAllChannels},
          /*disabled_features=*/{features::kForestFeature});
    }
  }

  void TearDown() override {
    release_notes_notification_.reset();
    tester_.reset();
    BrowserWithTestWindowTest::TearDown();
  }

  std::string GetDefaultProfileName() override {
    // TODO(crbug.com/40286020): Use google.com domain to forcibly enable
    // release note notification. Will merge into BrowserWithTestWindowTest.
    return "[email protected]";
  }

  void OnNotificationAdded() { notification_count_++; }

  bool forest_feature_enabled() const { return forest_feature_enabled_; }

 protected:
  bool HasReleaseNotesNotification() {
    return tester_->GetNotification("show_release_notes_notification")
        .has_value();
  }

  message_center::Notification GetReleaseNotesNotification() {
    return tester_->GetNotification("show_release_notes_notification").value();
  }

  int notification_count_ = 0;
  std::unique_ptr<ReleaseNotesNotification> release_notes_notification_;

 private:
  std::unique_ptr<NotificationDisplayServiceTester> tester_;
  base::test::ScopedFeatureList scoped_feature_list_;
  const bool forest_feature_enabled_;
};

INSTANTIATE_TEST_SUITE_P(All,
                         ReleaseNotesNotificationTest,
                         /*forest_feature=*/testing::Bool());

TEST_P(ReleaseNotesNotificationTest, DoNotShowReleaseNotesNotification) {
  auto release_notes_storage = std::make_unique<ReleaseNotesStorage>(profile());

  // Set the pref to the last shown milestone to ensure release notes do not
  // show.
  profile()->GetPrefs()->SetInteger(
      prefs::kHelpAppNotificationLastShownMilestone,
      version_info::GetVersion().components()[0]);

  release_notes_notification_->MaybeShowReleaseNotes();
  EXPECT_FALSE(HasReleaseNotesNotification());
  EXPECT_EQ(0, notification_count_);
}

TEST_P(ReleaseNotesNotificationTest, ShowReleaseNotesNotification) {
  auto release_notes_storage = std::make_unique<ReleaseNotesStorage>(profile());

  // Set the pref to an older milestone to ensure release notes do show.
  profile()->GetPrefs()->SetInteger(
      prefs::kHelpAppNotificationLastShownMilestone, 20);

  release_notes_notification_->MaybeShowReleaseNotes();

  // If forest feature is enabled, then release notes should not show.
  EXPECT_EQ(forest_feature_enabled(), !HasReleaseNotesNotification());
  EXPECT_EQ(forest_feature_enabled() ? 0 : 1, notification_count_);
  EXPECT_EQ(forest_feature_enabled(),
            !release_notes_storage->ShouldShowSuggestionChip());
  if (HasReleaseNotesNotification()) {
    EXPECT_TRUE(HasReleaseNotesNotification());
    EXPECT_EQ(ui::SubstituteChromeOSDeviceType(
                  IDS_RELEASE_NOTES_DEVICE_SPECIFIC_NOTIFICATION_TITLE),
              GetReleaseNotesNotification().title());
    EXPECT_EQ("Get highlights from the latest update",
              base::UTF16ToASCII(GetReleaseNotesNotification().message()));
    // And it show the release notes suggestion chip.
    EXPECT_EQ(3, profile()->GetPrefs()->GetInteger(
                     prefs::kReleaseNotesSuggestionChipTimesLeftToShow));
  }
}

}  // namespace ash