diff --git a/partners_api/ads/ads_base.cpp b/partners_api/ads/ads_base.cpp index d64184d900..dbb6a68060 100644 --- a/partners_api/ads/ads_base.cpp +++ b/partners_api/ads/ads_base.cpp @@ -90,20 +90,30 @@ std::string DownloadOnMapContainer::GetBanner(storage::CountryId const & country std::optional const & userPos, std::string const & userLanguage) const { - if (!userPos || !HasBanner(countryId, *userPos, userLanguage)) + if (!HasBanner(countryId, userPos, userLanguage)) return {}; return GetBannerInternal(); } bool DownloadOnMapContainer::HasBanner(storage::CountryId const & countryId, - m2::PointD const & userPos, + std::optional const & userPos, std::string const & userLanguage) const { storage::CountriesVec userPosCountries; - auto const userPosCountryId = m_delegate.GetCountryId(userPos); - userPosCountries.emplace_back(userPosCountryId); - userPosCountries.emplace_back(m_delegate.GetTopmostParentFor(userPosCountryId)); + if (userPos) + { + auto const userPosCountryId = m_delegate.GetCountryId(*userPos); + userPosCountries.emplace_back(userPosCountryId); + userPosCountries.emplace_back(m_delegate.GetTopmostParentFor(userPosCountryId)); + } + + bool isUserPosSupported = + (userPosCountries.empty() && IsUserPosCountrySupported("")) || + std::any_of(userPosCountries.begin(), userPosCountries.end(), + [this](auto const & id) { return IsUserPosCountrySupported(id); }); + if (!isUserPosSupported) + return false; storage::CountriesVec downloadMwmCountries; downloadMwmCountries.emplace_back(countryId); @@ -113,8 +123,6 @@ bool DownloadOnMapContainer::HasBanner(storage::CountryId const & countryId, [this](auto const & id) { return IsUserPosCountryExcluded(id); }) && !std::any_of(downloadMwmCountries.begin(), downloadMwmCountries.end(), [this](auto const & id) { return IsCountryExcluded(id); }) && - std::any_of(userPosCountries.begin(), userPosCountries.end(), - [this](auto const & id) { return IsUserPosCountrySupported(id); }) && std::any_of(downloadMwmCountries.begin(), downloadMwmCountries.end(), [this](auto const & id) { return IsCountrySupported(id); }) && IsLanguageSupported(userLanguage); diff --git a/partners_api/ads/ads_base.hpp b/partners_api/ads/ads_base.hpp index c7b2c6472b..f6f20f8260 100644 --- a/partners_api/ads/ads_base.hpp +++ b/partners_api/ads/ads_base.hpp @@ -108,8 +108,8 @@ protected: Delegate & m_delegate; private: - virtual bool HasBanner(storage::CountryId const & countryId, m2::PointD const & userPos, - std::string const & userLanguage) const; + bool HasBanner(storage::CountryId const & countryId, std::optional const & userPos, + std::string const & userLanguage) const; virtual std::string GetBannerInternal() const; DISALLOW_COPY(DownloadOnMapContainer); diff --git a/partners_api/partners_api_tests/mastercard_sberbank_tests.cpp b/partners_api/partners_api_tests/mastercard_sberbank_tests.cpp index f5a19512a6..83c453d360 100644 --- a/partners_api/partners_api_tests/mastercard_sberbank_tests.cpp +++ b/partners_api/partners_api_tests/mastercard_sberbank_tests.cpp @@ -15,6 +15,11 @@ UNIT_TEST(MastercardSberbank_GetBanner) auto const banner = masterSber.GetBanner("Russia_Tambov Oblast", point, "ru"); TEST(!banner.empty(), ()); } + { + delegate.SetTopmostParent("Russian Federation"); + auto const banner = masterSber.GetBanner("Russia_Tambov Oblast", {}, "ru"); + TEST(!banner.empty(), ()); + } { delegate.SetTopmostParent("United States of America"); auto const banner = masterSber.GetBanner("US_North Carolina_Raleigh", point, "ru"); diff --git a/partners_api/partners_api_tests/skyeng_tests.cpp b/partners_api/partners_api_tests/skyeng_tests.cpp index b0e9b551c8..3ccbb1c431 100644 --- a/partners_api/partners_api_tests/skyeng_tests.cpp +++ b/partners_api/partners_api_tests/skyeng_tests.cpp @@ -18,6 +18,10 @@ UNIT_TEST(Skyeng_GetBanner) auto const banner = skyeng.GetBanner("US_North Carolina_Raleigh", point, "ru"); TEST(!banner.empty(), ()); } + { + auto const banner = skyeng.GetBanner("US_North Carolina_Raleigh", {}, "ru"); + TEST(!banner.empty(), ()); + } { auto const banner = skyeng.GetBanner("Russia_Tambov Oblast", point, "en"); TEST(banner.empty(), ()); diff --git a/partners_api/partners_api_tests/tinkoff_airlines_tests.cpp b/partners_api/partners_api_tests/tinkoff_airlines_tests.cpp index 4384b1d4f2..22b0eff906 100644 --- a/partners_api/partners_api_tests/tinkoff_airlines_tests.cpp +++ b/partners_api/partners_api_tests/tinkoff_airlines_tests.cpp @@ -22,6 +22,12 @@ UNIT_TEST(TinkoffAirlines_GetBanner) auto const banner = tinkoffAirlines.GetBanner("", point, "ru"); TEST(banner.empty(), ()); } + { + delegate.SetTopmostParent("Germany"); + delegate.SetCountryId("Russian Federation"); + auto const banner = tinkoffAirlines.GetBanner("", {}, "ru"); + TEST(banner.empty(), ()); + } { delegate.SetTopmostParent("Germany"); delegate.SetCountryId("Russian Federation"); diff --git a/partners_api/partners_api_tests/tinkoff_insurance_tests.cpp b/partners_api/partners_api_tests/tinkoff_insurance_tests.cpp index 9e090d00d0..d97246d126 100644 --- a/partners_api/partners_api_tests/tinkoff_insurance_tests.cpp +++ b/partners_api/partners_api_tests/tinkoff_insurance_tests.cpp @@ -21,6 +21,12 @@ UNIT_TEST(TinkoffInsurance_GetBanner) auto const banner = tinkoffInsurance.GetBanner("", point, "ru"); TEST(!banner.empty(), ()); } + { + delegate.SetTopmostParent("France"); + delegate.SetCountryId("Russian Federation"); + auto const banner = tinkoffInsurance.GetBanner("", {}, "ru"); + TEST(banner.empty(), ()); + } { delegate.SetTopmostParent("France"); delegate.SetCountryId("Russian Federation");