| // Copyright 2023 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/promos/promos_utils.h" |
| |
| #include "base/json/values_util.h" |
| #include "base/test/metrics/histogram_tester.h" |
| #include "base/test/scoped_feature_list.h" |
| #include "chrome/browser/promos/promos_pref_names.h" |
| #include "chrome/browser/promos/promos_types.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/testing_browser_process.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "components/feature_engagement/public/feature_constants.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/prefs/scoped_user_pref_update.h" |
| #include "components/segmentation_platform/embedder/default_model/device_switcher_model.h" |
| #include "components/sync/test/test_sync_service.h" |
| #include "components/sync_preferences/testing_pref_service_syncable.h" |
| #include "content/public/test/browser_task_environment.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace promos_utils { |
| |
| class IOSPromoOnDesktopTest : public ::testing::Test { |
| public: |
| void SetUp() override { |
| sync_service_.GetUserSettings()->SetSelectedTypes(/*sync_everything=*/true, |
| {}); |
| } |
| |
| // Getter for the test syncable prefs service. |
| sync_preferences::TestingPrefServiceSyncable* prefs() { |
| return profile()->GetTestingPrefService(); |
| } |
| |
| // Getter for the browser task environment. |
| content::BrowserTaskEnvironment* environment() { return &task_environment_; } |
| |
| // Getter for the histograms tester. |
| base::HistogramTester* histograms() { return &histogram_; } |
| |
| // Getter for the features list. |
| base::test::ScopedFeatureList* features() { return &scoped_feature_list_; } |
| |
| // Getter for the testing profile. |
| TestingProfile* profile() { return &profile_; } |
| |
| // Getter for the testing sync_service. |
| syncer::TestSyncService* sync_service() { return &sync_service_; } |
| |
| private: |
| content::BrowserTaskEnvironment task_environment_{ |
| base::test::TaskEnvironment::MainThreadType::UI}; |
| base::HistogramTester histogram_; |
| base::test::ScopedFeatureList scoped_feature_list_; |
| TestingProfile profile_; |
| syncer::TestSyncService sync_service_; |
| }; |
| |
| // Tests RecordIOSDesktopPromoUserInteractionHistogram for all promo types. |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for first impression and action dismissed for the password promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestFirstImpressionDismissedForPasswordPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPassword, 1, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PasswordPromo.FirstImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for first impression and no thanks clicked action for the password |
| // promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestFirstImpressionNoThanksClickedForPasswordPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPassword, 1, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PasswordPromo.FirstImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for second impression and action dismissed for the password promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestSecondImpressionDismissedForPasswordPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPassword, 2, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PasswordPromo.SecondImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for second impression and no thanks clicked action for the password |
| // promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestSecondImpressionNoThanksClickedForPasswordPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPassword, 2, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PasswordPromo.SecondImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for third impression and action dismissed for the password promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestThirdImpressionDismissedForPasswordPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPassword, 3, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PasswordPromo.ThirdImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for third impression and no thanks clicked action for the |
| // password promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestThirdImpressionNoThanksClickedForPasswordPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPassword, 3, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PasswordPromo.ThirdImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for first impression and action dismissed for the address promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestFirstImpressionDismissedForAddressPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kAddress, 1, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.AddressPromo.FirstImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for first impression and no thanks clicked action for the address |
| // promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestFirstImpressionNoThanksClickedForAddressPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kAddress, 1, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.AddressPromo.FirstImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for second impression and action dismissed for the address promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestSecondImpressionDismissedForAddressPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kAddress, 2, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.AddressPromo.SecondImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for second impression and no thanks clicked action for the |
| // address promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestSecondImpressionNoThanksClickedForAddressPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kAddress, 2, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.AddressPromo.SecondImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for third impression and action dismissed for the address promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestThirdImpressionDismissedForAddressPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kAddress, 3, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.AddressPromo.ThirdImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for third impression and no thanks clicked action for the |
| // address promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestThirdImpressionNoThanksClickedForAddressPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kAddress, 3, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.AddressPromo.ThirdImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests ShouldShowIOSDesktopPromo with all promo types. |
| // Tests that ShouldShowIOSDesktopPromo returns true when no promo has yet been |
| // shown for the given password promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestTrueForPasswordPromo) { |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the promotions are |
| // disabled. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalsePromotionsDisabled) { |
| TestingBrowserProcess::GetGlobal()->local_state()->SetBoolean( |
| prefs::kPromotionsEnabled, false); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has already |
| // seen 3 promos for the given password promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseTooManyImpressionsForPasswordPromo) { |
| prefs()->SetInteger( |
| promos_prefs::kDesktopToiOSPasswordPromoImpressionsCounter, 3); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the last seen |
| // impression is too recent for the given password promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseLastImpressionTooRecentForPasswordPromo) { |
| prefs()->SetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp, |
| base::Time::Now()); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has |
| // opted-out from the given password promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseUserOptedOutForPasswordPromo) { |
| prefs()->SetBoolean(promos_prefs::kDesktopToiOSPasswordPromoOptOut, true); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns true when no promo has yet been |
| // shown for the given address promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestTrueForAddressPromo) { |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has already |
| // seen 3 promos for the given address promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseTooManyImpressionsForAddressPromo) { |
| prefs()->SetInteger(promos_prefs::kDesktopToiOSAddressPromoImpressionsCounter, |
| 3); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the last seen |
| // impression is too recent for the given address promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseLastImpressionTooRecentForAddressPromo) { |
| prefs()->SetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp, |
| base::Time::Now()); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has |
| // opted-out from the given address promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseUserOptedOutForAddressPromo) { |
| prefs()->SetBoolean(promos_prefs::kDesktopToiOSAddressPromoOptOut, true); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the first impression for the given password promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestFirstImpressionForPasswordPromo) { |
| // Record before and after times to ensure the timestamp is within that range. |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPassword); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPasswordPromoImpressionsCounter), |
| 1); |
| ASSERT_GE( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectUniqueSample("IOS.Desktop.PasswordPromo.Shown", |
| DesktopIOSPromoImpression::kFirstImpression, |
| 1); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the second impression for the given password promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestSecondImpressionForPasswordPromo) { |
| // First impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPassword); |
| |
| // Second impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPassword); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPasswordPromoImpressionsCounter), |
| 2); |
| ASSERT_GE( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectBucketCount("IOS.Desktop.PasswordPromo.Shown", |
| DesktopIOSPromoImpression::kSecondImpression, |
| 1); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the third impression for the given password promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestThirdImpressionForPasswordPromo) { |
| // First impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPassword); |
| |
| // Second impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPassword); |
| |
| // Third impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPassword); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPasswordPromoImpressionsCounter), |
| 3); |
| ASSERT_GE( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectBucketCount("IOS.Desktop.PasswordPromo.Shown", |
| DesktopIOSPromoImpression::kThirdImpression, |
| 1); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the first impression for the given address promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestFirstImpressionForAddressPromo) { |
| // Record before and after times to ensure the timestamp is within that range. |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kAddress); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSAddressPromoImpressionsCounter), |
| 1); |
| ASSERT_GE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectUniqueSample("IOS.Desktop.AddressPromo.Shown", |
| DesktopIOSPromoImpression::kFirstImpression, |
| 1); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the second impression for the given address promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestSecondImpressionForAddressPromo) { |
| // First impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kAddress); |
| |
| // Second impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kAddress); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSAddressPromoImpressionsCounter), |
| 2); |
| ASSERT_GE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectBucketCount("IOS.Desktop.AddressPromo.Shown", |
| DesktopIOSPromoImpression::kSecondImpression, |
| 1); |
| } |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the third impression for the given address promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestThirdImpressionForAddressPromo) { |
| // First impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kAddress); |
| |
| // Second impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kAddress); |
| |
| // Third impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kAddress); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSAddressPromoImpressionsCounter), |
| 3); |
| ASSERT_GE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectBucketCount("IOS.Desktop.AddressPromo.Shown", |
| DesktopIOSPromoImpression::kThirdImpression, |
| 1); |
| } |
| |
| // Tests that UserNotClassifiedAsMobileDeviceSwitcher returns true when the |
| // result is successful and the mobile labels are not present in the |
| // classification labels. |
| TEST_F(IOSPromoOnDesktopTest, UserNotClassifiedAsMobileDeviceSwitcherTestTrue) { |
| segmentation_platform::ClassificationResult result( |
| segmentation_platform::PredictionStatus::kSucceeded); |
| result.ordered_labels.emplace_back("test_label"); |
| EXPECT_TRUE(promos_utils::UserNotClassifiedAsMobileDeviceSwitcher(result)); |
| } |
| |
| // Tests that UserNotClassifiedAsMobileDeviceSwitcher returns false when the |
| // result has an error. |
| TEST_F(IOSPromoOnDesktopTest, |
| UserNotClassifiedAsMobileDeviceSwitcherTestFalseError) { |
| segmentation_platform::ClassificationResult result( |
| segmentation_platform::PredictionStatus::kFailed); |
| EXPECT_FALSE(promos_utils::UserNotClassifiedAsMobileDeviceSwitcher(result)); |
| } |
| |
| // Tests that UserNotClassifiedAsMobileDeviceSwitcher returns false when a |
| // mobile label is present in the classification results. |
| TEST_F(IOSPromoOnDesktopTest, |
| UserNotClassifiedAsMobileDeviceSwitcherTestFalseMobileLabelPresent) { |
| segmentation_platform::ClassificationResult result( |
| segmentation_platform::PredictionStatus::kSucceeded); |
| result.ordered_labels.emplace_back( |
| segmentation_platform::DeviceSwitcherModel::kIosPhoneChromeLabel); |
| EXPECT_FALSE(promos_utils::UserNotClassifiedAsMobileDeviceSwitcher(result)); |
| } |
| |
| // Tests that RegisterProfilePrefs registers the prefs to their default values |
| // correctly. |
| TEST_F(IOSPromoOnDesktopTest, RegisterProfilePrefsTest) { |
| // Password promo. |
| ASSERT_FALSE( |
| prefs()->GetBoolean(promos_prefs::kDesktopToiOSPasswordPromoOptOut)); |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPasswordPromoImpressionsCounter), |
| 0); |
| ASSERT_EQ( |
| prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPasswordPromoLastImpressionTimestamp), |
| base::Time()); |
| |
| // Address promo. |
| ASSERT_FALSE( |
| prefs()->GetBoolean(promos_prefs::kDesktopToiOSAddressPromoOptOut)); |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSAddressPromoImpressionsCounter), |
| 0); |
| ASSERT_EQ(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSAddressPromoLastImpressionTimestamp), |
| base::Time()); |
| |
| // Payment promo. |
| ASSERT_FALSE( |
| prefs()->GetBoolean(promos_prefs::kDesktopToiOSPaymentPromoOptOut)); |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter), |
| 0); |
| ASSERT_EQ(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| base::Time()); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for first impression and action dismissed for the payment promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestFirstImpressionDismissedForPaymentPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPayment, 1, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PaymentPromo.FirstImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for first impression and no thanks clicked action for the payment |
| // promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestFirstImpressionNoThanksClickedForPaymentPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPayment, 1, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PaymentPromo.FirstImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for second impression and action dismissed for the payment promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestSecondImpressionDismissedForPaymentPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPayment, 2, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PaymentPromo.SecondImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for second impression and no thanks clicked action for the |
| // payment promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestSecondImpressionNoThanksClickedForPaymentPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPayment, 2, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PaymentPromo.SecondImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for third impression and action dismissed for the payment promo |
| // type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestThirdImpressionDismissedForPaymentPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPayment, 3, DesktopIOSPromoAction::kDismissed); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PaymentPromo.ThirdImpression.Action", |
| DesktopIOSPromoAction::kDismissed, 1); |
| } |
| |
| // Tests that RecordIOSDesktopPromoUserInteractionHistogram records the proper |
| // histogram for third impression and no thanks clicked action for the |
| // payment promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| RecordIOSDesktopPromoUserInteractionHistogramTestThirdImpressionNoThanksClickedForPaymentPromo) { |
| RecordIOSDesktopPromoUserInteractionHistogram( |
| IOSPromoType::kPayment, 3, DesktopIOSPromoAction::kNoThanksClicked); |
| |
| histograms()->ExpectUniqueSample( |
| "IOS.Desktop.PaymentPromo.ThirdImpression.Action", |
| DesktopIOSPromoAction::kNoThanksClicked, 1); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns true when no promo has yet been |
| // shown for the given payment promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestTrueForPaymentPromo) { |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has already |
| // seen 3 promos for the given payment promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseTooManyImpressionsForPaymentPromo) { |
| prefs()->SetInteger(promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter, |
| 3); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the last seen |
| // impression is too recent for the given payment promo type. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseLastImpressionTooRecentForPaymentPromo) { |
| prefs()->SetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp, |
| base::Time::Now()); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has |
| // opted-out from the given payment promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseUserOptedOutForPaymentPromo) { |
| prefs()->SetBoolean(promos_prefs::kDesktopToiOSPaymentPromoOptOut, true); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has |
| // seen too many other promos and that the Desktop NTP promo only counts as 1, |
| // no matter how many times it has actually shown. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseTooManyOtherPromos) { |
| // First, make sure that 10 is the limit. |
| prefs()->SetInteger(promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter, |
| 10); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| |
| prefs()->SetInteger(promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter, |
| 9); |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| |
| // Go two below the limit so adding Desktop NTP promo impressions pushes back |
| // to one below the limit. |
| prefs()->SetInteger(promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter, |
| 8); |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| |
| base::Time promo_time = base::Time::Now() - base::Days(1000); |
| base::Value::List desktop_ntp_promo_timestamps; |
| desktop_ntp_promo_timestamps.Append(base::TimeToValue(promo_time)); |
| prefs()->SetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps, |
| std::move(desktop_ntp_promo_timestamps)); |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| |
| // Add a second timestamp and the promo should still be able to be shown. |
| { |
| ScopedListPrefUpdate update( |
| prefs(), promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps); |
| update->Append(base::TimeToValue(promo_time + base::Seconds(1))); |
| } |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| |
| // Setting another promo's count higher should block the promo again. |
| prefs()->SetInteger(promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter, |
| 9); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has |
| // seen the Desktop Ntp promo too recently. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopPromoTestFalseDesktopNtpPromoTooRecent) { |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| |
| prefs()->SetList( |
| promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps, |
| base::Value::List().Append(base::TimeToValue(base::Time::Now()))); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the first impression for the given payment promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestFirstImpressionForPaymentPromo) { |
| // Record before and after times to ensure the timestamp is within that range. |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPayment); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter), |
| 1); |
| ASSERT_GE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectUniqueSample("IOS.Desktop.PaymentPromo.Shown", |
| DesktopIOSPromoImpression::kFirstImpression, |
| 1); |
| } |
| |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the second impression for the given payment promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestSecondImpressionForPaymentPromo) { |
| // First impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPayment); |
| |
| // Second impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPayment); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter), |
| 2); |
| ASSERT_GE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectBucketCount("IOS.Desktop.PaymentPromo.Shown", |
| DesktopIOSPromoImpression::kSecondImpression, |
| 1); |
| } |
| // Tests that IOSDesktopPromoShown sets the correct prefs and records the |
| // correct histogram for the third impression for the given payment promo |
| // type. |
| TEST_F(IOSPromoOnDesktopTest, |
| IOSDesktopPromoShownTestThirdImpressionForPaymentPromo) { |
| // First impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPayment); |
| |
| // Second impression |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPayment); |
| |
| // Third impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopPromoShown(profile(), IOSPromoType::kPayment); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ(prefs()->GetInteger( |
| promos_prefs::kDesktopToiOSPaymentPromoImpressionsCounter), |
| 3); |
| ASSERT_GE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| before); |
| ASSERT_LE(prefs()->GetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp), |
| after); |
| |
| histograms()->ExpectBucketCount("IOS.Desktop.PaymentPromo.Shown", |
| DesktopIOSPromoImpression::kThirdImpression, |
| 1); |
| } |
| |
| // Tests getting the correct password promo Feature Engagement Tracker |
| // feature. |
| TEST_F(IOSPromoOnDesktopTest, GetIOSDesktopPromoFeatureEngagementPasswords) { |
| const base::Feature& feature = |
| GetIOSDesktopPromoFeatureEngagement(IOSPromoType::kPassword); |
| |
| ASSERT_EQ(&feature, &feature_engagement::kIPHiOSPasswordPromoDesktopFeature); |
| } |
| |
| // Tests getting the correct address promo Feature Engagement Tracker feature. |
| TEST_F(IOSPromoOnDesktopTest, GetIOSDesktopPromoFeatureEngagementAddress) { |
| const base::Feature& feature = |
| GetIOSDesktopPromoFeatureEngagement(IOSPromoType::kAddress); |
| |
| ASSERT_EQ(&feature, &feature_engagement::kIPHiOSAddressPromoDesktopFeature); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns true when the correct datatypes |
| // are syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| PasswordPromoSyncPrefsPasswordsAndPreferencesEnabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPasswords, |
| syncer::UserSelectableType::kPreferences}); |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the preferences |
| // datatype is not syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| PasswordPromoSyncPrefsPasswordsEnabledPreferencesDisabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPasswords}); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the passwords |
| // datatype is not syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| PasswordPromoSyncPrefsPreferencesEnabledPasswordsDisabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPreferences}); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPassword)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns true when the correct datatypes |
| // are syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| AddressPromoSyncPrefsAutofillAndPreferencesEnabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kAutofill, |
| syncer::UserSelectableType::kPreferences}); |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the preferences |
| // datatype is not syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| AddressPromoSyncPrefsAutofillEnabledPreferencesDisabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kAutofill}); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the autofill datatype |
| // is not syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| AddressPromoSyncPrefsPreferencesEnabledAutofillDisabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPreferences}); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kAddress)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns true when the correct datatypes |
| // are syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| PaymentPromoSyncPrefsPaymentsAndPreferencesEnabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPayments, |
| syncer::UserSelectableType::kPreferences}); |
| EXPECT_TRUE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the preferences |
| // datatype is not syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| PaymentPromoSyncPrefsPaymentsEnabledPreferencesDisabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPayments}); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the payments datatype |
| // is not syncing. |
| TEST_F(IOSPromoOnDesktopTest, |
| PaymentPromoSyncPrefsPreferencesEnabledPaymentsDisabled) { |
| sync_service()->GetUserSettings()->SetSelectedTypes( |
| /*sync_everything=*/false, /*types=*/ |
| {syncer::UserSelectableType::kPreferences}); |
| EXPECT_FALSE(ShouldShowIOSDesktopPromo(profile(), sync_service(), |
| IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when sync service is null. |
| TEST_F(IOSPromoOnDesktopTest, PromoSyncPrefsSyncServiceNull) { |
| EXPECT_FALSE( |
| ShouldShowIOSDesktopPromo(profile(), nullptr, IOSPromoType::kPayment)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopNtpPromo returns true when no promo has yet |
| // been shown. |
| TEST_F(IOSPromoOnDesktopTest, ShouldShowIOSDesktopNtpPromo) { |
| EXPECT_TRUE(ShouldShowIOSDesktopNtpPromo(profile(), sync_service())); |
| } |
| |
| // Tests that ShouldShowIOSDesktopNtpPromo returns false when the promotions are |
| // disabled. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopNtpPromoFalsePromotionsDisabled) { |
| TestingBrowserProcess::GetGlobal()->local_state()->SetBoolean( |
| prefs::kPromotionsEnabled, false); |
| EXPECT_FALSE(ShouldShowIOSDesktopNtpPromo(profile(), sync_service())); |
| } |
| |
| // Tests that ShouldShowIOSDesktopNtpPromo returns false when sync service is |
| // null. |
| TEST_F(IOSPromoOnDesktopTest, ShouldShowIOSDesktopNtpPromoSyncServiceNull) { |
| EXPECT_FALSE(ShouldShowIOSDesktopNtpPromo(profile(), nullptr)); |
| } |
| |
| // Tests that ShouldShowIOSDesktopNtpPromo returns false when the user has |
| // already seen 10 promos. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopNtpPromoTestFalseTooManyImpressions) { |
| base::Value::List timestamps; |
| for (int i = 0; i < 10; i++) { |
| timestamps.Append(base::TimeToValue(base::Time::Now() - base::Hours(1) + |
| base::Seconds(i))); |
| } |
| prefs()->SetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps, |
| std::move(timestamps)); |
| EXPECT_FALSE(ShouldShowIOSDesktopNtpPromo(profile(), sync_service())); |
| } |
| |
| // Tests that ShouldShowIOSDesktopNtpPromo returns false when the user has |
| // dismissed the promo. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopNtpPromoTestFalseUserDismissed) { |
| prefs()->SetBoolean(promos_prefs::kDesktopToiOSNtpPromoDismissed, true); |
| EXPECT_FALSE(ShouldShowIOSDesktopNtpPromo(profile(), sync_service())); |
| } |
| |
| // Tests that ShouldShowIOSDesktopNtpPromo returns false when the another promo |
| // type has a too recent last impression. |
| TEST_F( |
| IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopNtpPromoTestFalseLastImpressionTooRecentForOtherPromo) { |
| prefs()->SetTime( |
| promos_prefs::kDesktopToiOSPaymentPromoLastImpressionTimestamp, |
| base::Time::Now()); |
| EXPECT_FALSE(ShouldShowIOSDesktopNtpPromo(profile(), sync_service())); |
| } |
| |
| // Tests that ShouldShowIOSDesktopPromo returns false when the user has already |
| // seen 3 promos for the given password promo type. |
| TEST_F(IOSPromoOnDesktopTest, |
| ShouldShowIOSDesktopNtpPromoTestFalseTooManyImpressionsForOtherPromos) { |
| prefs()->SetInteger( |
| promos_prefs::kDesktopToiOSPasswordPromoImpressionsCounter, 12); |
| EXPECT_FALSE(ShouldShowIOSDesktopNtpPromo(profile(), sync_service())); |
| } |
| |
| // Tests that IOSDesktopNtpPromoShown sets the correct prefs. |
| TEST_F(IOSPromoOnDesktopTest, IOSDesktopNtpPromoShownTest) { |
| // First impression |
| base::Time before = base::Time::Now(); |
| IOSDesktopNtpPromoShown(prefs()); |
| base::Time after = base::Time::Now(); |
| |
| ASSERT_EQ( |
| prefs() |
| ->GetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps) |
| .size(), |
| 1u); |
| ASSERT_GE( |
| base::ValueToTime( |
| prefs() |
| ->GetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps) |
| .back()), |
| before); |
| ASSERT_LE( |
| base::ValueToTime( |
| prefs() |
| ->GetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps) |
| .back()), |
| after); |
| |
| // Second impression |
| before = base::Time::Now(); |
| IOSDesktopNtpPromoShown(prefs()); |
| after = base::Time::Now(); |
| |
| ASSERT_EQ( |
| prefs() |
| ->GetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps) |
| .size(), |
| 2u); |
| ASSERT_GE( |
| base::ValueToTime( |
| prefs() |
| ->GetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps) |
| .back()), |
| before); |
| ASSERT_LE( |
| base::ValueToTime( |
| prefs() |
| ->GetList(promos_prefs::kDesktopToiOSNtpPromoAppearanceTimestamps) |
| .back()), |
| after); |
| } |
| |
| } // namespace promos_utils |