Index: ios/chrome/browser/ui/payments/payment_request_view_controller_unittest.mm |
diff --git a/ios/chrome/browser/ui/payments/payment_request_view_controller_unittest.mm b/ios/chrome/browser/ui/payments/payment_request_view_controller_unittest.mm |
index f42b497a237736108d85bbc36ac384b5edf614e4..ad35d5818e1fa566181dee5d93914937a5b2c094 100644 |
--- a/ios/chrome/browser/ui/payments/payment_request_view_controller_unittest.mm |
+++ b/ios/chrome/browser/ui/payments/payment_request_view_controller_unittest.mm |
@@ -4,6 +4,8 @@ |
#import "ios/chrome/browser/ui/payments/payment_request_view_controller.h" |
+#import <Foundation/Foundation.h> |
+ |
#include "base/mac/foundation_util.h" |
#include "base/memory/ptr_util.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -12,16 +14,18 @@ |
#include "components/autofill/core/browser/credit_card.h" |
#include "components/autofill/core/browser/test_personal_data_manager.h" |
#include "components/strings/grit/components_strings.h" |
-#include "ios/chrome/browser/payments/payment_request.h" |
#include "ios/chrome/browser/payments/payment_request_test_util.h" |
+#include "ios/chrome/browser/payments/test_payment_request.h" |
#import "ios/chrome/browser/ui/autofill/cells/status_item.h" |
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_detail_item.h" |
+#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" |
#import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h" |
#import "ios/chrome/browser/ui/payments/cells/autofill_profile_item.h" |
#import "ios/chrome/browser/ui/payments/cells/page_info_item.h" |
#import "ios/chrome/browser/ui/payments/cells/payment_method_item.h" |
#import "ios/chrome/browser/ui/payments/cells/payments_text_item.h" |
#import "ios/chrome/browser/ui/payments/cells/price_item.h" |
+#import "ios/chrome/browser/ui/payments/payment_request_view_controller_data_source.h" |
#include "ios/chrome/grit/ios_strings.h" |
#include "ios/web/public/payments/payment_request.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -31,6 +35,107 @@ |
#error "This file requires ARC support." |
#endif |
+@interface TestPaymentRequestMediator |
+ : NSObject<PaymentRequestViewControllerDataSource> |
+ |
+@end |
+ |
+@implementation TestPaymentRequestMediator |
+ |
+- (BOOL)canPay { |
+ return YES; |
+} |
+ |
+- (BOOL)canShip { |
+ return YES; |
+} |
+ |
+- (BOOL)hasPaymentItems { |
+ return YES; |
+} |
+ |
+- (BOOL)requestShipping { |
+ return YES; |
+} |
+ |
+- (BOOL)requestContactInfo { |
+ return YES; |
+} |
+ |
+- (CollectionViewItem*)paymentSummaryItem { |
+ return [[PriceItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)shippingSectionHeaderItem { |
+ return [[PaymentsTextItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)shippingAddressItem { |
+ return [[AutofillProfileItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)shippingOptionItem { |
+ return [[PaymentsTextItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)paymentMethodSectionHeaderItem { |
+ return [[PaymentsTextItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)paymentMethodItem { |
+ return [[PaymentMethodItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)contactInfoSectionHeaderItem { |
+ return [[PaymentsTextItem alloc] init]; |
+} |
+ |
+- (CollectionViewItem*)contactInfoItem { |
+ return [[AutofillProfileItem alloc] init]; |
+} |
+ |
+- (CollectionViewFooterItem*)footerItem { |
+ return [[CollectionViewFooterItem alloc] init]; |
+} |
+ |
+@end |
+ |
+@interface TestPaymentRequestMediatorNoShipping : TestPaymentRequestMediator |
+ |
+@end |
+ |
+@implementation TestPaymentRequestMediatorNoShipping |
+ |
+- (BOOL)requestShipping { |
+ return NO; |
+} |
+ |
+@end |
+ |
+@interface TestPaymentRequestMediatorNoContactInfo : TestPaymentRequestMediator |
+ |
+@end |
+ |
+@implementation TestPaymentRequestMediatorNoContactInfo |
+ |
+- (BOOL)requestContactInfo { |
+ return NO; |
+} |
+ |
+@end |
+ |
+@interface TestPaymentRequestMediatorCantShip : TestPaymentRequestMediator |
+ |
+@end |
+ |
+@implementation TestPaymentRequestMediatorCantShip |
+ |
+- (BOOL)canShip { |
+ return NO; |
+} |
+ |
+@end |
+ |
class PaymentRequestViewControllerTest : public CollectionViewControllerTest { |
protected: |
PaymentRequestViewControllerTest() |
@@ -39,15 +144,19 @@ class PaymentRequestViewControllerTest : public CollectionViewControllerTest { |
// Add testing profile and credit card to autofill::TestPersonalDataManager. |
personal_data_manager_.AddTestingProfile(&autofill_profile_); |
personal_data_manager_.AddTestingCreditCard(&credit_card_); |
- } |
- CollectionViewController* InstantiateController() override { |
- payment_request_ = base::MakeUnique<PaymentRequest>( |
+ payment_request_ = base::MakeUnique<TestPaymentRequest>( |
payment_request_test_util::CreateTestWebPaymentRequest(), |
&personal_data_manager_); |
- return [[PaymentRequestViewController alloc] |
- initWithPaymentRequest:payment_request_.get()]; |
+ mediator_ = [[TestPaymentRequestMediator alloc] init]; |
+ } |
+ |
+ CollectionViewController* InstantiateController() override { |
+ PaymentRequestViewController* viewController = |
+ [[PaymentRequestViewController alloc] init]; |
+ [viewController setDataSource:mediator_]; |
+ return viewController; |
} |
PaymentRequestViewController* GetPaymentRequestViewController() { |
@@ -58,7 +167,8 @@ class PaymentRequestViewControllerTest : public CollectionViewControllerTest { |
autofill::AutofillProfile autofill_profile_; |
autofill::CreditCard credit_card_; |
autofill::TestPersonalDataManager personal_data_manager_; |
- std::unique_ptr<PaymentRequest> payment_request_; |
+ std::unique_ptr<TestPaymentRequest> payment_request_; |
+ TestPaymentRequestMediator* mediator_; |
}; |
// Tests that the correct items are displayed after loading the model. |
@@ -69,17 +179,14 @@ TEST_F(PaymentRequestViewControllerTest, TestModel) { |
[GetPaymentRequestViewController() loadModel]; |
- // There should be five sections in total. Summary, Shipping, Payment, |
- // Contact info and a footer. |
+ // There should be five sections in total. Summary, Shipping, Payment Method, |
+ // Contact Info and the Footer. |
ASSERT_EQ(5, NumberOfSections()); |
// The only item in the Summary section should be of type PriceItem. |
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(0))); |
id item = GetCollectionViewItem(0, 0); |
EXPECT_TRUE([item isMemberOfClass:[PriceItem class]]); |
- PriceItem* price_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator, |
- price_item.accessoryType); |
// There should be two items in the Shipping section. |
ASSERT_EQ(2U, static_cast<unsigned int>(NumberOfItemsInSection(1))); |
@@ -87,103 +194,129 @@ TEST_F(PaymentRequestViewControllerTest, TestModel) { |
// The first one should be of type AutofillProfileItem. |
item = GetCollectionViewItem(1, 0); |
EXPECT_TRUE([item isMemberOfClass:[AutofillProfileItem class]]); |
- AutofillProfileItem* shipping_address_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator, |
- shipping_address_item.accessoryType); |
// The next item should be of type PaymentsTextItem. |
item = GetCollectionViewItem(1, 1); |
EXPECT_TRUE([item isMemberOfClass:[PaymentsTextItem class]]); |
- PaymentsTextItem* shipping_option_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator, |
- shipping_option_item.accessoryType); |
- // The only item in the Payment section should be of type PaymentMethodItem. |
+ // The only item in the Payment Method section should be of type |
+ // PaymentMethodItem. |
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(2))); |
item = GetCollectionViewItem(2, 0); |
EXPECT_TRUE([item isMemberOfClass:[PaymentMethodItem class]]); |
- // The only item in the Contact info section should be of type |
+ // The only item in the Contact Info section should be of type |
// AutofillProfileItem. |
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(3))); |
item = GetCollectionViewItem(3, 0); |
EXPECT_TRUE([item isMemberOfClass:[AutofillProfileItem class]]); |
+ |
+ // The only item in the Footer section should be of type |
+ // CollectionViewFooterItem. |
+ ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(4))); |
+ item = GetCollectionViewItem(4, 0); |
+ EXPECT_TRUE([item isMemberOfClass:[CollectionViewFooterItem class]]); |
} |
-// Tests that the correct items are displayed after loading the model, when |
-// there are no display items. |
-TEST_F(PaymentRequestViewControllerTest, TestModelNoDisplayItem) { |
+// Tests that the correct items are displayed after loading the model, when no |
+// shipping information is requested. |
+TEST_F(PaymentRequestViewControllerTest, TestModelNoShipping) { |
+ mediator_ = [[TestPaymentRequestMediatorNoShipping alloc] init]; |
+ |
CreateController(); |
CheckController(); |
- payment_request_->UpdatePaymentDetails(web::PaymentDetails()); |
- [GetPaymentRequestViewController() loadModel]; |
+ // There should be four sections in total now. |
+ ASSERT_EQ(4, NumberOfSections()); |
- // The only item in the Summary section should stil be of type PriceItem, but |
- // without an accessory view. |
- ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(0))); |
- id item = GetCollectionViewItem(0, 0); |
- EXPECT_TRUE([item isMemberOfClass:[PriceItem class]]); |
- PriceItem* price_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryNone, price_item.accessoryType); |
+ // The second section is the Payment Method section isntead of the Shipping |
+ // section. |
+ ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(1))); |
+ CollectionViewItem* item = GetCollectionViewItem(1, 0); |
+ EXPECT_TRUE([item isMemberOfClass:[PaymentMethodItem class]]); |
} |
-// Tests that the correct items are displayed after loading the model, when |
-// there is no selected shipping addresse. |
-TEST_F(PaymentRequestViewControllerTest, TestModelNoSelectedShippingAddress) { |
+// Tests that the correct items are displayed after loading the model, when no |
+// contact information is requested. |
+TEST_F(PaymentRequestViewControllerTest, TestModelNoContactInfo) { |
+ mediator_ = [[TestPaymentRequestMediatorNoContactInfo alloc] init]; |
+ |
CreateController(); |
CheckController(); |
- payment_request_->set_selected_shipping_profile(nullptr); |
- [GetPaymentRequestViewController() loadModel]; |
+ // There should be four sections in total now. |
+ ASSERT_EQ(4, NumberOfSections()); |
- // There should still be two items in the Shipping section. |
- ASSERT_EQ(2U, static_cast<unsigned int>(NumberOfItemsInSection(1))); |
+ // The fourth section is the Footer section instead of the Contact Info |
+ // section. |
+ ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(3))); |
+ CollectionViewItem* item = GetCollectionViewItem(3, 0); |
+ EXPECT_TRUE([item isMemberOfClass:[CollectionViewFooterItem class]]); |
+} |
- // The first one should be of type CollectionViewDetailItem. |
+// Tests that the correct items are displayed after loading the model, when |
+// shipping can't be made. |
+TEST_F(PaymentRequestViewControllerTest, TestModelCantShip) { |
+ mediator_ = [[TestPaymentRequestMediatorCantShip alloc] init]; |
+ |
+ CreateController(); |
+ CheckController(); |
+ |
+ // There should only be one item in the Shipping section and it should be of |
+ // type AutofillProfileItem. |
+ ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(1))); |
id item = GetCollectionViewItem(1, 0); |
- EXPECT_TRUE([item isMemberOfClass:[CollectionViewDetailItem class]]); |
- CollectionViewDetailItem* detail_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryNone, detail_item.accessoryType); |
+ EXPECT_TRUE([item isMemberOfClass:[AutofillProfileItem class]]); |
} |
-// Tests that the correct items are displayed after loading the model, when |
-// there is no selected shipping option. |
-TEST_F(PaymentRequestViewControllerTest, TestModelNoSelectedShippingOption) { |
+// Tests that the correct items are displayed after updating the Shipping |
+// section. |
+TEST_F(PaymentRequestViewControllerTest, TestUpdateShippingSection) { |
CreateController(); |
CheckController(); |
- // Resetting the payment details should reset the selected shipping option. |
- payment_request_->UpdatePaymentDetails(web::PaymentDetails()); |
- [GetPaymentRequestViewController() loadModel]; |
+ [GetPaymentRequestViewController() updateShippingSection]; |
- // There should still be two items in the Shipping section. |
+ // There should be two items in the Shipping section. |
ASSERT_EQ(2U, static_cast<unsigned int>(NumberOfItemsInSection(1))); |
- // The second one should be of type CollectionViewDetailItem. |
- id item = GetCollectionViewItem(1, 1); |
- EXPECT_TRUE([item isMemberOfClass:[CollectionViewDetailItem class]]); |
- CollectionViewDetailItem* detail_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator, |
- detail_item.accessoryType); |
+ // The first one should be of type AutofillProfileItem. |
+ id item = GetCollectionViewItem(1, 0); |
+ EXPECT_TRUE([item isMemberOfClass:[AutofillProfileItem class]]); |
+ |
+ // The next item should be of type PaymentsTextItem. |
+ item = GetCollectionViewItem(1, 1); |
+ EXPECT_TRUE([item isMemberOfClass:[PaymentsTextItem class]]); |
} |
-// Tests that the correct items are displayed after loading the model, when |
-// there is no selected payment method. |
-TEST_F(PaymentRequestViewControllerTest, TestModelNoSelectedPaymentMethod) { |
+// Tests that the correct items are displayed after updating the Payment Method |
+// section. |
+TEST_F(PaymentRequestViewControllerTest, TestUpdatePaymentMethodSection) { |
CreateController(); |
CheckController(); |
- payment_request_->set_selected_credit_card(nullptr); |
- [GetPaymentRequestViewController() loadModel]; |
+ [GetPaymentRequestViewController() updatePaymentMethodSection]; |
- // The only item in the Payment section should be of type |
- // CollectionViewDetailItem. |
+ // The only item in the Payment Method section should be of type |
+ // PaymentMethodItem. |
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(2))); |
id item = GetCollectionViewItem(2, 0); |
- EXPECT_TRUE([item isMemberOfClass:[CollectionViewDetailItem class]]); |
- CollectionViewDetailItem* detail_item = item; |
- EXPECT_EQ(MDCCollectionViewCellAccessoryNone, detail_item.accessoryType); |
+ EXPECT_TRUE([item isMemberOfClass:[PaymentMethodItem class]]); |
+} |
+ |
+// Tests that the correct items are displayed after updating the Contact Info |
+// section. |
+TEST_F(PaymentRequestViewControllerTest, TestUpdateContactInfoSection) { |
+ CreateController(); |
+ CheckController(); |
+ |
+ [GetPaymentRequestViewController() updatePaymentMethodSection]; |
+ |
+ // The only item in the Contact Info section should be of type |
+ // AutofillProfileItem. |
+ ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(3))); |
+ id item = GetCollectionViewItem(3, 0); |
+ EXPECT_TRUE([item isMemberOfClass:[AutofillProfileItem class]]); |
} |
// Tests that the correct items are displayed after loading the model, when |
@@ -203,13 +336,3 @@ TEST_F(PaymentRequestViewControllerTest, TestModelPendingState) { |
id item = GetCollectionViewItem(0, 0); |
EXPECT_TRUE([item isMemberOfClass:[StatusItem class]]); |
} |
- |
-TEST_F(PaymentRequestViewControllerTest, TestSignedInStringFormatting) { |
- const std::string unformattedString = l10n_util::GetStringUTF8( |
- IDS_PAYMENTS_CARD_AND_ADDRESS_SETTINGS_SIGNED_IN); |
- const std::string formattedString = l10n_util::GetStringFUTF8( |
- IDS_PAYMENTS_CARD_AND_ADDRESS_SETTINGS_SIGNED_IN, |
- base::ASCIIToUTF16("example@gmail.com")); |
- |
- EXPECT_NE(unformattedString, formattedString); |
-} |