blob: 3324b133bf15943b026b00460304c52586d284d9 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/payments/credit_card_edit_view_controller.h"
#include "base/mac/foundation_util.h"
#include "base/memory/ptr_util.h"
#include "components/autofill/core/browser/field_types.h"
#include "components/autofill/core/browser/test_personal_data_manager.h"
#import "ios/chrome/browser/payments/credit_card_edit_mediator.h"
#include "ios/chrome/browser/payments/payment_request.h"
#import "ios/chrome/browser/payments/payment_request_editor_field.h"
#include "ios/chrome/browser/payments/payment_request_test_util.h"
#import "ios/chrome/browser/ui/autofill/autofill_ui_type.h"
#import "ios/chrome/browser/ui/autofill/cells/autofill_edit_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/cells/collection_view_switch_item.h"
#import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h"
#include "ios/web/public/payments/payment_request.h"
#include "testing/gtest/include/gtest/gtest.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface TestCreditCardEditViewControllerMediator
: CreditCardEditViewControllerMediator
@end
@implementation TestCreditCardEditViewControllerMediator
NSArray<EditorField*>* editorFields() {
return @[
[[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardNumber
label:@"Credit Card Number"
value:@"4111111111111111" /* Visa */
required:YES],
[[EditorField alloc]
initWithAutofillUIType:AutofillUITypeCreditCardHolderFullName
label:@"Cardholder Name"
value:@"John Doe"
required:YES],
[[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardExpMonth
label:@"Expiration Month"
value:@"12"
required:YES],
[[EditorField alloc] initWithAutofillUIType:AutofillUITypeCreditCardExpYear
label:@"Expiration Year"
value:@"2090"
required:YES],
];
}
@end
class PaymentRequestCreditCardEditViewControllerTest
: public CollectionViewControllerTest {
protected:
CollectionViewController* InstantiateController() override {
payment_request_ = base::MakeUnique<PaymentRequest>(
payment_request_test_util::CreateTestWebPaymentRequest(),
&personal_data_manager_);
CreditCardEditViewControllerMediator* mediator =
[[CreditCardEditViewControllerMediator alloc]
initWithPaymentRequest:payment_request_.get()
creditCard:nil];
CreditCardEditViewController* viewController =
[[CreditCardEditViewController alloc] init];
[viewController setDataSource:mediator];
return viewController;
}
CreditCardEditViewController* GetCreditCardEditViewController() {
return base::mac::ObjCCastStrict<CreditCardEditViewController>(
controller());
}
autofill::TestPersonalDataManager personal_data_manager_;
std::unique_ptr<PaymentRequest> payment_request_;
};
// Tests that the correct number of items are displayed after loading the model.
TEST_F(PaymentRequestCreditCardEditViewControllerTest, TestModel) {
CreateController();
CheckController();
[GetCreditCardEditViewController()
setState:CreditCardEditViewControllerStateEdit];
[GetCreditCardEditViewController() loadModel];
// There is one section for every textfield (there are four textfields in
// total), one for the footer, and one for the billing address ID item.
ASSERT_EQ(6, NumberOfSections());
// The first four sections have only one item of the type AutofillEditItem.
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(0)));
id item = GetCollectionViewItem(0, 0);
EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]);
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(1)));
item = GetCollectionViewItem(1, 0);
EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]);
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(2)));
item = GetCollectionViewItem(2, 0);
EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]);
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(3)));
item = GetCollectionViewItem(3, 0);
EXPECT_TRUE([item isMemberOfClass:[AutofillEditItem class]]);
// The billing address section contains one item which is of the type
// CollectionViewDetailItem.
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(4)));
item = GetCollectionViewItem(4, 0);
EXPECT_TRUE([item isMemberOfClass:[CollectionViewDetailItem class]]);
CollectionViewDetailItem* billing_address_item = item;
EXPECT_EQ(MDCCollectionViewCellAccessoryDisclosureIndicator,
billing_address_item.accessoryType);
// The footer section contains one item which is of the type
// CollectionViewFooterItem.
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(5)));
item = GetCollectionViewItem(5, 0);
EXPECT_TRUE([item isMemberOfClass:[CollectionViewFooterItem class]]);
}
// Tests that the correct number of items are displayed after loading the model,
// when creating a new credit card.
TEST_F(PaymentRequestCreditCardEditViewControllerTest,
TestModelCreateNewCreditCard) {
CreateController();
CheckController();
[GetCreditCardEditViewController()
setState:CreditCardEditViewControllerStateCreate];
[GetCreditCardEditViewController() loadModel];
// There is an extra section containing a switch that allows the user to save
// the credit card locally.
ASSERT_EQ(7, NumberOfSections());
// The switch section is the last section before the footer and has one item
// of the type CollectionViewSwitchItem. The switch is on by defualt.
ASSERT_EQ(1U, static_cast<unsigned int>(NumberOfItemsInSection(5)));
id item = GetCollectionViewItem(5, 0);
EXPECT_TRUE([item isMemberOfClass:[CollectionViewSwitchItem class]]);
CollectionViewSwitchItem* switch_item = item;
EXPECT_EQ(YES, [switch_item isOn]);
}