GIDSignInButtonTest.m 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. // Copyright 2021 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #import <TargetConditionals.h>
  15. #if TARGET_OS_IOS || TARGET_OS_MACCATALYST
  16. #import <UIKit/UIKit.h>
  17. #import <XCTest/XCTest.h>
  18. #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignInButton.h"
  19. #ifdef SWIFT_PACKAGE
  20. @import OCMock;
  21. #else
  22. #import <OCMock/OCMock.h>
  23. #endif
  24. static NSString *const kWidthConstraintIdentifier =
  25. @"buttonWidth - auto generated by GIDSignInButton";
  26. static NSString *const kHeightConstraintIdentifier =
  27. @"buttonHeight - auto generated by GIDSignInButton";
  28. static NSString * const kAppBundleId = @"FakeBundleID";
  29. @interface GIDSignInButton (Test)
  30. - (void)updateUI;
  31. @end
  32. @interface GIDSignInButtonTest : XCTestCase
  33. @end
  34. @implementation GIDSignInButtonTest
  35. #pragma mark - Tests
  36. // Verify the default style and color scheme for the button.
  37. - (void)testDefaultButtonSettings {
  38. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  39. XCTAssertTrue(button.style == kGIDSignInButtonStyleStandard,
  40. @"Default button style is incorrect");
  41. XCTAssertTrue(button.colorScheme == kGIDSignInButtonColorSchemeLight,
  42. @"Default button color scheme is incorrect");
  43. }
  44. // Verify that setting the button's style/color scheme will refresh the image.
  45. - (void)testRefreshImage {
  46. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  47. id buttonMock = OCMPartialMock(button);
  48. [[buttonMock expect] updateUI];
  49. [(GIDSignInButton *)buttonMock setStyle:kGIDSignInButtonStyleWide];
  50. [buttonMock verify];
  51. [[buttonMock expect] updateUI];
  52. [buttonMock setColorScheme:kGIDSignInButtonColorSchemeDark];
  53. [buttonMock verify];
  54. }
  55. - (void)testNSCoding {
  56. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  57. button.style = kGIDSignInButtonStyleIconOnly;
  58. button.colorScheme = kGIDSignInButtonColorSchemeLight;
  59. NSError *archiveError;
  60. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:button
  61. requiringSecureCoding:NO
  62. error:&archiveError];
  63. XCTAssertNil(archiveError);
  64. NSError *unarchiveError;
  65. GIDSignInButton *newButton = [NSKeyedUnarchiver unarchivedObjectOfClass:[GIDSignInButton class]
  66. fromData:data
  67. error:&unarchiveError];
  68. XCTAssertNil(unarchiveError);
  69. XCTAssertEqual(button.style, newButton.style);
  70. XCTAssertEqual(button.colorScheme, newButton.colorScheme);
  71. }
  72. - (void)testSetStyle {
  73. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  74. id buttonMock = OCMPartialMock(button);
  75. [[buttonMock expect] setNeedsDisplay];
  76. button.style = kGIDSignInButtonStyleWide;
  77. [buttonMock verify];
  78. XCTAssertEqual(button.style, kGIDSignInButtonStyleWide);
  79. [[buttonMock expect] setNeedsDisplay];
  80. button.style = kGIDSignInButtonStyleIconOnly;
  81. [buttonMock verify];
  82. XCTAssertEqual(button.style, kGIDSignInButtonStyleIconOnly);
  83. [[buttonMock expect] setNeedsDisplay];
  84. button.style = kGIDSignInButtonStyleStandard;
  85. [buttonMock verify];
  86. XCTAssertEqual(button.style, kGIDSignInButtonStyleStandard);
  87. }
  88. - (void)testSetEnabled {
  89. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  90. id buttonMock = OCMPartialMock(button);
  91. // Checks default value for |button.enabled|
  92. XCTAssertTrue(button.enabled, @"Button should be default enabled");
  93. // Checks that button redraw when enabled set YES.
  94. [[buttonMock expect] setNeedsDisplay];
  95. button.enabled = NO;
  96. [buttonMock verify];
  97. // Checks nothing happen if setting same value.
  98. button.enabled = NO;
  99. // Checks that button redraw when enabled set YES.
  100. [[buttonMock expect] setNeedsDisplay];
  101. button.enabled = YES;
  102. [buttonMock verify];
  103. // Checks nothing happen if setting same value.
  104. button.enabled = YES;
  105. }
  106. - (void)testWidthAndHeightConstraintAddition {
  107. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  108. XCTAssertEqual([button.constraints count], 0u);
  109. [button updateConstraints];
  110. XCTAssertEqual([button.constraints count], 2u);
  111. // Ensure we don't duplicate constraints
  112. [button updateConstraints];
  113. XCTAssertEqual([button.constraints count], 2u);
  114. }
  115. - (void)testHeightConstraintReplacement {
  116. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  117. [button addConstraint:[NSLayoutConstraint constraintWithItem:button
  118. attribute:NSLayoutAttributeHeight
  119. relatedBy:NSLayoutRelationEqual
  120. toItem:nil
  121. attribute:NSLayoutAttributeNotAnAttribute
  122. multiplier:1.0
  123. constant:30]];
  124. XCTAssertEqual([button.constraints count], 1u);
  125. [button updateConstraints];
  126. XCTAssertEqual([button.constraints count], 2u);
  127. for (NSLayoutConstraint *constraint in button.constraints) {
  128. if ([constraint.identifier isEqualToString:kHeightConstraintIdentifier]) {
  129. XCTAssertEqual(constraint.firstAttribute, NSLayoutAttributeHeight);
  130. XCTAssertEqual(constraint.constant, 48);
  131. return;
  132. }
  133. }
  134. XCTFail(@"New constraint not found.");
  135. }
  136. - (void)testWidthConstraintBelowMinimumRemoval {
  137. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  138. [button addConstraint:[NSLayoutConstraint constraintWithItem:button
  139. attribute:NSLayoutAttributeWidth
  140. relatedBy:NSLayoutRelationEqual
  141. toItem:nil
  142. attribute:NSLayoutAttributeNotAnAttribute
  143. multiplier:1.0
  144. constant:50]];
  145. XCTAssertEqual([button.constraints count], 1u);
  146. [button updateConstraints];
  147. XCTAssertEqual([button.constraints count], 2u);
  148. for (NSLayoutConstraint *constraint in button.constraints) {
  149. XCTAssertTrue([constraint.identifier isEqualToString:kWidthConstraintIdentifier] ||
  150. [constraint.identifier isEqualToString:kHeightConstraintIdentifier]);
  151. }
  152. }
  153. - (void)testDontRemoveValidWidthConstraint {
  154. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  155. NSLayoutConstraint *widthConstraint =
  156. [NSLayoutConstraint constraintWithItem:button
  157. attribute:NSLayoutAttributeWidth
  158. relatedBy:NSLayoutRelationEqual
  159. toItem:nil
  160. attribute:NSLayoutAttributeNotAnAttribute
  161. multiplier:1.0
  162. constant:250];
  163. [button addConstraint:widthConstraint];
  164. XCTAssertEqual([button.constraints count], 1u);
  165. [button updateConstraints];
  166. XCTAssertEqual([button.constraints count], 3u);
  167. XCTAssertTrue([button.constraints containsObject:widthConstraint]);
  168. }
  169. - (void)testDontRemoveValidHeightConstraint {
  170. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  171. NSLayoutConstraint *heightConstraint =
  172. [NSLayoutConstraint constraintWithItem:button
  173. attribute:NSLayoutAttributeHeight
  174. relatedBy:NSLayoutRelationEqual
  175. toItem:nil
  176. attribute:NSLayoutAttributeNotAnAttribute
  177. multiplier:1.0
  178. constant:48];
  179. [button addConstraint:heightConstraint];
  180. XCTAssertEqual([button.constraints count], 1u);
  181. [button updateConstraints];
  182. XCTAssertEqual([button.constraints count], 2u);
  183. XCTAssertTrue([button.constraints containsObject:heightConstraint]);
  184. }
  185. @end
  186. #endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST