diff --git a/Example/Stripe iOS Application Tests/STPPaymentCardTextFieldUITests.m b/Example/Stripe iOS Application Tests/STPPaymentCardTextFieldUITests.m index 7925e3eb1f..50dc730c66 100644 --- a/Example/Stripe iOS Application Tests/STPPaymentCardTextFieldUITests.m +++ b/Example/Stripe iOS Application Tests/STPPaymentCardTextFieldUITests.m @@ -55,7 +55,48 @@ XCTAssertEqualObjects(self.sut.expirationField.text, @"10/99"); XCTAssertEqualObjects(self.sut.cvcField.text, cvc); XCTAssertEqualObjects(self.sut.selectedField, self.sut.cvcField); + XCTAssertTrue([self.sut.cvcField isFirstResponder]); XCTAssertTrue(self.sut.isValid); } +- (void)testSetCard_partialNumberAndExpiration_whileEditingExpiration { + XCTAssertTrue([self.sut.expirationField becomeFirstResponder]); + STPCardParams *card = [STPCardParams new]; + NSString *number = @"42"; + card.number = number; + card.expMonth = 10; + card.expYear = 99; + [self.sut setCard:card]; + NSData *imgData = UIImagePNGRepresentation(self.sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([STPPaymentCardTextField brandImageForCardBrand:STPCardBrandVisa]); + + XCTAssertTrue(self.sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(self.sut.numberField.text, number); + XCTAssertEqualObjects(self.sut.expirationField.text, @"10/99"); + XCTAssertEqual(self.sut.cvcField.text.length, (NSUInteger)0); + XCTAssertEqualObjects(self.sut.selectedField, self.sut.cvcField); + XCTAssertTrue([self.sut.cvcField isFirstResponder]); + XCTAssertFalse(self.sut.isValid); +} + +- (void)testSetCard_number_whileEditingCVC { + XCTAssertTrue([self.sut.cvcField becomeFirstResponder]); + STPCardParams *card = [STPCardParams new]; + NSString *number = @"4242424242424242"; + card.number = number; + [self.sut setCard:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([STPPaymentCardTextField brandImageForCardBrand:STPCardBrandVisa]); + + XCTAssertTrue(self.sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(self.sut.numberField.text, number); + XCTAssertEqual(self.sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqual(self.sut.cvcField.text.length, (NSUInteger)0); + XCTAssertEqualObjects(self.sut.selectedField, self.sut.expirationField); + XCTAssertTrue([self.sut.expirationField isFirstResponder]); + XCTAssertFalse(sut.isValid); +} + @end diff --git a/Stripe/UI/STPPaymentCardTextField.m b/Stripe/UI/STPPaymentCardTextField.m index 1db7cbbfee..6faa7ecf0e 100644 --- a/Stripe/UI/STPPaymentCardTextField.m +++ b/Stripe/UI/STPPaymentCardTextField.m @@ -418,11 +418,8 @@ CGFloat const STPPaymentCardTextFieldDefaultPadding = 10; } [self setText:card.cvc inField:STPCardFieldTypeCVC]; - if (![self isFirstResponder]) { - BOOL shrinkNumberField = ((expirationPresent || card.cvc.length) && !card.number.length) || - [self shouldShrinkNumberField]; - [self setNumberFieldShrunk:shrinkNumberField animated:NO completion:nil]; - } + BOOL shrinkNumberField = (expirationPresent || card.cvc.length) || [self shouldShrinkNumberField]; + [self setNumberFieldShrunk:shrinkNumberField animated:NO completion:nil]; // update the card image, falling back to the number field image if not editing if ([self.expirationField isFirstResponder]) { diff --git a/Tests/Tests/STPPaymentCardTextFieldTest.m b/Tests/Tests/STPPaymentCardTextFieldTest.m index 5b303dbe74..f0e3cdc121 100644 --- a/Tests/Tests/STPPaymentCardTextFieldTest.m +++ b/Tests/Tests/STPPaymentCardTextFieldTest.m @@ -151,7 +151,7 @@ NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); NSData *expectedImgData = UIImagePNGRepresentation([STPPaymentCardTextField brandImageForCardBrand:STPCardBrandVisa]); - XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue(sut.numberFieldShrunk); XCTAssertTrue([expectedImgData isEqualToData:imgData]); XCTAssertEqualObjects(sut.numberField.text, number); XCTAssertEqualObjects(sut.expirationField.text, @"10/99");