Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/chrome/browser/payments/credit_card_edit_view_controller.h" | 5 #import "ios/chrome/browser/payments/credit_card_edit_view_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/foundation_util.h" | 7 #include "base/mac/foundation_util.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "components/autofill/core/browser/field_types.h" | 9 #include "components/autofill/core/browser/field_types.h" |
| 10 #include "components/autofill/core/browser/test_personal_data_manager.h" | 10 #import "ios/chrome/browser/payments/cells/payment_method_item.h" |
| 11 #import "ios/chrome/browser/payments/credit_card_edit_mediator.h" | |
| 12 #include "ios/chrome/browser/payments/payment_request.h" | |
| 13 #import "ios/chrome/browser/payments/payment_request_editor_field.h" | 11 #import "ios/chrome/browser/payments/payment_request_editor_field.h" |
| 14 #include "ios/chrome/browser/payments/payment_request_test_util.h" | 12 #include "ios/chrome/browser/payments/payment_request_test_util.h" |
| 15 #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" | 13 #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" |
| 16 #import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h" | 14 #import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h" |
| 17 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_detail_item .h" | 15 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_detail_item .h" |
| 18 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item .h" | 16 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item .h" |
| 19 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item .h" | 17 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item .h" |
| 18 #import "ios/chrome/browser/ui/collection_view/cells/test_utils.h" | |
| 20 #import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h " | 19 #import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h " |
| 21 #include "ios/web/public/payments/payment_request.h" | 20 #include "ios/web/public/payments/payment_request.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 22 |
| 24 #if !defined(__has_feature) || !__has_feature(objc_arc) | 23 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 25 #error "This file requires ARC support." | 24 #error "This file requires ARC support." |
| 26 #endif | 25 #endif |
| 27 | 26 |
| 28 @interface TestCreditCardEditViewControllerMediator | 27 @interface TestCreditCardEditViewControllerMediator |
| 29 : CreditCardEditViewControllerMediator | 28 : NSObject<CreditCardEditViewControllerDataSource> |
| 30 | 29 |
| 31 @end | 30 @end |
| 32 | 31 |
| 33 @implementation TestCreditCardEditViewControllerMediator | 32 @implementation TestCreditCardEditViewControllerMediator |
| 34 | 33 |
| 35 NSArray<EditorField*>* editorFields() { | 34 - (CollectionViewItem*)serverCardSummaryItem { |
| 35 return [[PaymentMethodItem alloc] init]; | |
| 36 } | |
| 37 | |
| 38 - (NSArray<EditorField*>*)editorFields { | |
| 36 return @[ | 39 return @[ |
| 37 [[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardNumber | 40 [[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardNumber |
| 38 label:@"Credit Card Number" | 41 label:@"Credit Card Number" |
| 39 value:@"4111111111111111" /* Visa */ | 42 value:@"4111111111111111" /* Visa */ |
| 40 required:YES], | 43 required:YES], |
| 41 [[EditorField alloc] | 44 [[EditorField alloc] |
| 42 initWithAutofillUIType:AutofillUITypeCreditCardHolderFullName | 45 initWithAutofillUIType:AutofillUITypeCreditCardHolderFullName |
| 43 label:@"Cardholder Name" | 46 label:@"Cardholder Name" |
| 44 value:@"John Doe" | 47 value:@"John Doe" |
| 45 required:YES], | 48 required:YES], |
| 46 [[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardExpMonth | 49 [[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardExpMonth |
| 47 label:@"Expiration Month" | 50 label:@"Expiration Month" |
| 48 value:@"12" | 51 value:@"12" |
| 49 required:YES], | 52 required:YES], |
| 50 [[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardExpYear | 53 [[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardExpYear |
| 51 label:@"Expiration Year" | 54 label:@"Expiration Year" |
| 52 value:@"2090" | 55 value:@"2090" |
| 53 required:YES], | 56 required:YES], |
| 54 ]; | 57 ]; |
| 55 } | 58 } |
| 56 | 59 |
| 60 - (NSString*)billingAddressLabelForProfileWithGUID:(NSString*)profileGUID { | |
| 61 return nil; | |
| 62 } | |
| 63 | |
| 64 - (UIImage*)cardTypeIconFromCardNumber:(NSString*)cardNumber { | |
| 65 return nil; | |
| 66 } | |
| 67 | |
| 57 @end | 68 @end |
| 58 | 69 |
| 59 class PaymentRequestCreditCardEditViewControllerTest | 70 class PaymentRequestCreditCardEditViewControllerTest |
| 60 : public CollectionViewControllerTest { | 71 : public CollectionViewControllerTest { |
| 61 protected: | 72 protected: |
| 62 CollectionViewController* InstantiateController() override { | 73 CollectionViewController* InstantiateController() override { |
| 63 payment_request_ = base::MakeUnique<PaymentRequest>( | 74 mediator_ = [[TestCreditCardEditViewControllerMediator alloc] init]; |
| 64 payment_request_test_util::CreateTestWebPaymentRequest(), | |
| 65 &personal_data_manager_); | |
| 66 | |
| 67 CreditCardEditViewControllerMediator* mediator = | |
| 68 [[CreditCardEditViewControllerMediator alloc] | |
| 69 initWithPaymentRequest:payment_request_.get() | |
| 70 creditCard:nil]; | |
| 71 | 75 |
| 72 CreditCardEditViewController* viewController = | 76 CreditCardEditViewController* viewController = |
| 73 [[CreditCardEditViewController alloc] init]; | 77 [[CreditCardEditViewController alloc] init]; |
| 74 [viewController setDataSource:mediator]; | 78 [viewController setDataSource:mediator_]; |
| 75 return viewController; | 79 return viewController; |
| 76 } | 80 } |
| 77 | 81 |
| 78 CreditCardEditViewController* GetCreditCardEditViewController() { | 82 CreditCardEditViewController* GetCreditCardEditViewController() { |
| 79 return base::mac::ObjCCastStrict<CreditCardEditViewController>( | 83 return base::mac::ObjCCastStrict<CreditCardEditViewController>( |
| 80 controller()); | 84 controller()); |
| 81 } | 85 } |
| 82 | 86 |
| 83 autofill::TestPersonalDataManager personal_data_manager_; | 87 TestCreditCardEditViewControllerMediator* mediator_; |
|
macourteau
2017/04/19 15:12:42
nit: = nullptr
Moe
2017/04/19 19:10:29
Done.
| |
| 84 std::unique_ptr<PaymentRequest> payment_request_; | |
| 85 }; | 88 }; |
| 86 | 89 |
| 87 // Tests that the correct number of items are displayed after loading the model. | 90 // Tests that the correct number of items are displayed after loading the model. |
| 88 TEST_F(PaymentRequestCreditCardEditViewControllerTest, TestModel) { | 91 TEST_F(PaymentRequestCreditCardEditViewControllerTest, TestModel) { |
| 89 CreateController(); | 92 CreateController(); |
| 90 CheckController(); | 93 CheckController(); |
| 91 | 94 |
| 92 [GetCreditCardEditViewController() | 95 [GetCreditCardEditViewController() |
| 93 setState:CreditCardEditViewControllerStateEdit]; | 96 setState:CreditCardEditViewControllerStateEdit]; |
| 94 [GetCreditCardEditViewController() loadModel]; | 97 [GetCreditCardEditViewController() loadModel]; |
| 95 | 98 |
| 96 // There is one section for every textfield (there are four textfields in | 99 // There is one section for every textfield (there are four textfields in |
| 97 // total), one for the footer, and one for the billing address ID item. | 100 // total), one for the server card summary section, one for the footer, and |
| 98 ASSERT_EQ(6, NumberOfSections()); | 101 // one for the billing address ID item. |
| 102 ASSERT_EQ(7, NumberOfSections()); | |
| 99 | 103 |
| 100 // The first four sections have only one item of the type AutofillEditItem. | 104 // The server card summary section is the first section and has one item of |
| 105 // the type PaymentMethodItem. | |
| 101 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(0))); | 106 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(0))); |
| 102 id item = GetCollectionViewItem(0, 0); | 107 id item = GetCollectionViewItem(0, 0); |
| 103 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); | 108 EXPECT_TRUE([item isMemberOfClass:[PaymentMethodItem class]]); |
| 104 | 109 |
| 110 // The next four sections have only one item of the type AutofillEditItem. | |
| 105 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(1))); | 111 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(1))); |
| 106 item = GetCollectionViewItem(1, 0); | 112 item = GetCollectionViewItem(1, 0); |
| 107 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); | 113 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); |
| 108 | 114 |
| 109 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(2))); | 115 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(2))); |
| 110 item = GetCollectionViewItem(2, 0); | 116 item = GetCollectionViewItem(2, 0); |
| 111 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); | 117 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); |
| 112 | 118 |
| 113 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(3))); | 119 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(3))); |
| 114 item = GetCollectionViewItem(3, 0); | 120 item = GetCollectionViewItem(3, 0); |
| 115 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); | 121 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); |
| 116 | 122 |
| 123 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(4))); | |
| 124 item = GetCollectionViewItem(4, 0); | |
| 125 EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]); | |
| 126 | |
| 117 // The billing address section contains one item which is of the type | 127 // The billing address section contains one item which is of the type |
| 118 // CollectionViewDetailItem. | 128 // CollectionViewDetailItem. |
| 119 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(4))); | 129 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(5))); |
| 120 item = GetCollectionViewItem(4, 0); | 130 item = GetCollectionViewItem(5, 0); |
| 121 EXPECT_TRUE([item isMemberOfClass:[CollectionViewDetailItem class]]); | 131 EXPECT_TRUE([item isMemberOfClass:[CollectionViewDetailItem class]]); |
| 122 CollectionViewDetailItem* billing_address_item = item; | 132 CollectionViewDetailItem* billing_address_item = item; |
| 123 EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator, | 133 EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator, |
| 124 billing_address_item.accessoryType); | 134 billing_address_item.accessoryType); |
| 125 | 135 |
| 126 // The footer section contains one item which is of the type | 136 // The footer section contains one item which is of the type |
| 127 // CollectionViewFooterItem. | 137 // CollectionViewFooterItem. |
| 128 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(5))); | 138 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(6))); |
| 129 item = GetCollectionViewItem(5, 0); | 139 item = GetCollectionViewItem(6, 0); |
| 130 EXPECT_TRUE([item isMemberOfClass:[CollectionViewFooterItem class]]); | 140 EXPECT_TRUE([item isMemberOfClass:[CollectionViewFooterItem class]]); |
| 131 } | 141 } |
| 132 | 142 |
| 133 // Tests that the correct number of items are displayed after loading the model, | 143 // Tests that the correct number of items are displayed after loading the model, |
| 134 // when creating a new credit card. | 144 // when creating a new credit card. |
| 135 TEST_F(PaymentRequestCreditCardEditViewControllerTest, | 145 TEST_F(PaymentRequestCreditCardEditViewControllerTest, |
| 136 TestModelCreateNewCreditCard) { | 146 TestModelCreateNewCreditCard) { |
| 137 CreateController(); | 147 CreateController(); |
| 138 CheckController(); | 148 CheckController(); |
| 139 | 149 |
| 140 [GetCreditCardEditViewController() | 150 [GetCreditCardEditViewController() |
| 141 setState:CreditCardEditViewControllerStateCreate]; | 151 setState:CreditCardEditViewControllerStateCreate]; |
| 142 [GetCreditCardEditViewController() loadModel]; | 152 [GetCreditCardEditViewController() loadModel]; |
| 143 | 153 |
| 144 // There is an extra section containing a switch that allows the user to save | 154 // There is an extra section containing a switch that allows the user to save |
| 145 // the credit card locally. | 155 // the credit card locally. |
| 146 ASSERT_EQ(7, NumberOfSections()); | 156 ASSERT_EQ(8, NumberOfSections()); |
| 147 | 157 |
| 148 // The switch section is the last section before the footer and has one item | 158 // The switch section is the last section before the footer and has one item |
| 149 // of the type CollectionViewSwitchItem. The switch is on by defualt. | 159 // of the type CollectionViewSwitchItem. The switch is on by defualt. |
| 150 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(5))); | 160 ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(6))); |
| 151 id item = GetCollectionViewItem(5, 0); | 161 id item = GetCollectionViewItem(6, 0); |
| 152 EXPECT_TRUE([item isMemberOfClass:[CollectionViewSwitchItem class]]); | 162 EXPECT_TRUE([item isMemberOfClass:[CollectionViewSwitchItem class]]); |
| 153 CollectionViewSwitchItem* switch_item = item; | 163 CollectionViewSwitchItem* switch_item = item; |
| 154 EXPECT_EQ(YES, [switch_item isOn]); | 164 EXPECT_EQ(YES, [switch_item isOn]); |
| 155 } | 165 } |
| OLD | NEW |