GIDSignInButtonTest.m 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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 <UIKit/UIKit.h>
  15. #import <XCTest/XCTest.h>
  16. #import "GoogleSignIn/Sources/GIDSignInButton_Private.h"
  17. #import "GoogleSignIn/Sources/GIDSignIn_Private.h"
  18. #import "GoogleSignIn/Tests/Unit/GIDFakeSignIn.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. GIDFakeSignIn *_signIn;
  36. }
  37. - (void)setUp {
  38. _signIn = [[GIDFakeSignIn alloc] init];
  39. [_signIn startMocking];
  40. }
  41. - (void)tearDown {
  42. [_signIn stopMocking];
  43. }
  44. #pragma mark - Tests
  45. // Verify the default style and color scheme for the button.
  46. - (void)testDefaultButtonSettings {
  47. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  48. XCTAssertTrue(button.style == kGIDSignInButtonStyleStandard,
  49. @"Default button style is incorrect");
  50. XCTAssertTrue(button.colorScheme == kGIDSignInButtonColorSchemeLight,
  51. @"Default button color scheme is incorrect");
  52. }
  53. // Verify that setting the button's style/color scheme will refresh the image.
  54. - (void)testRefreshImage {
  55. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  56. id buttonMock = OCMPartialMock(button);
  57. [[buttonMock expect] updateUI];
  58. [(GIDSignInButton *)buttonMock setStyle:kGIDSignInButtonStyleWide];
  59. [buttonMock verify];
  60. [[buttonMock expect] updateUI];
  61. [buttonMock setColorScheme:kGIDSignInButtonColorSchemeDark];
  62. [buttonMock verify];
  63. }
  64. - (void)testNSCoding {
  65. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  66. button.style = kGIDSignInButtonStyleIconOnly;
  67. button.colorScheme = kGIDSignInButtonColorSchemeLight;
  68. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:button];
  69. GIDSignInButton *newButton = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  70. XCTAssertEqual(button.style, newButton.style);
  71. XCTAssertEqual(button.colorScheme, newButton.colorScheme);
  72. }
  73. - (void)testSetStyle {
  74. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  75. id buttonMock = OCMPartialMock(button);
  76. [[buttonMock expect] setNeedsDisplay];
  77. button.style = kGIDSignInButtonStyleWide;
  78. [buttonMock verify];
  79. XCTAssertEqual(button.style, kGIDSignInButtonStyleWide);
  80. [[buttonMock expect] setNeedsDisplay];
  81. button.style = kGIDSignInButtonStyleIconOnly;
  82. [buttonMock verify];
  83. XCTAssertEqual(button.style, kGIDSignInButtonStyleIconOnly);
  84. [[buttonMock expect] setNeedsDisplay];
  85. button.style = kGIDSignInButtonStyleStandard;
  86. [buttonMock verify];
  87. XCTAssertEqual(button.style, kGIDSignInButtonStyleStandard);
  88. }
  89. - (void)testPressed {
  90. id signInMock = OCMPartialMock([GIDSignIn sharedInstance]);
  91. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  92. [[signInMock expect] signInWithOptions:[OCMArg any]];
  93. [button pressed];
  94. [signInMock verify];
  95. }
  96. - (void)testSetEnabled {
  97. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  98. id buttonMock = OCMPartialMock(button);
  99. // Checks default value for |button.enabled|
  100. XCTAssertTrue(button.enabled, @"Button should be default enabled");
  101. // Checks that button redraw when enabled set YES.
  102. [[buttonMock expect] setNeedsDisplay];
  103. button.enabled = NO;
  104. [buttonMock verify];
  105. // Checks nothing happen if setting same value.
  106. button.enabled = NO;
  107. // Checks that button redraw when enabled set YES.
  108. [[buttonMock expect] setNeedsDisplay];
  109. button.enabled = YES;
  110. [buttonMock verify];
  111. // Checks nothing happen if setting same value.
  112. button.enabled = YES;
  113. }
  114. - (void)testWidthAndHeightConstraintAddition {
  115. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  116. XCTAssertEqual([button.constraints count], 0u);
  117. [button updateConstraints];
  118. XCTAssertEqual([button.constraints count], 2u);
  119. // Ensure we don't duplicate constraints
  120. [button updateConstraints];
  121. XCTAssertEqual([button.constraints count], 2u);
  122. }
  123. - (void)testHeightConstraintReplacement {
  124. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  125. [button addConstraint:[NSLayoutConstraint constraintWithItem:button
  126. attribute:NSLayoutAttributeHeight
  127. relatedBy:NSLayoutRelationEqual
  128. toItem:nil
  129. attribute:NSLayoutAttributeNotAnAttribute
  130. multiplier:1.0
  131. constant:30]];
  132. XCTAssertEqual([button.constraints count], 1u);
  133. [button updateConstraints];
  134. XCTAssertEqual([button.constraints count], 2u);
  135. for (NSLayoutConstraint *constraint in button.constraints) {
  136. if ([constraint.identifier isEqualToString:kHeightConstraintIdentifier]) {
  137. XCTAssertEqual(constraint.firstAttribute, NSLayoutAttributeHeight);
  138. XCTAssertEqual(constraint.constant, 48);
  139. return;
  140. }
  141. }
  142. XCTFail(@"New constraint not found.");
  143. }
  144. - (void)testWidthConstraintBelowMinimumRemoval {
  145. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  146. [button addConstraint:[NSLayoutConstraint constraintWithItem:button
  147. attribute:NSLayoutAttributeWidth
  148. relatedBy:NSLayoutRelationEqual
  149. toItem:nil
  150. attribute:NSLayoutAttributeNotAnAttribute
  151. multiplier:1.0
  152. constant:50]];
  153. XCTAssertEqual([button.constraints count], 1u);
  154. [button updateConstraints];
  155. XCTAssertEqual([button.constraints count], 2u);
  156. for (NSLayoutConstraint *constraint in button.constraints) {
  157. XCTAssertTrue([constraint.identifier isEqualToString:kWidthConstraintIdentifier] ||
  158. [constraint.identifier isEqualToString:kHeightConstraintIdentifier]);
  159. }
  160. }
  161. - (void)testDontRemoveValidWidthConstraint {
  162. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  163. NSLayoutConstraint *widthConstraint =
  164. [NSLayoutConstraint constraintWithItem:button
  165. attribute:NSLayoutAttributeWidth
  166. relatedBy:NSLayoutRelationEqual
  167. toItem:nil
  168. attribute:NSLayoutAttributeNotAnAttribute
  169. multiplier:1.0
  170. constant:250];
  171. [button addConstraint:widthConstraint];
  172. XCTAssertEqual([button.constraints count], 1u);
  173. [button updateConstraints];
  174. XCTAssertEqual([button.constraints count], 3u);
  175. XCTAssertTrue([button.constraints containsObject:widthConstraint]);
  176. }
  177. - (void)testDontRemoveValidHeightConstraint {
  178. GIDSignInButton *button = [[GIDSignInButton alloc] init];
  179. NSLayoutConstraint *heightConstraint =
  180. [NSLayoutConstraint constraintWithItem:button
  181. attribute:NSLayoutAttributeHeight
  182. relatedBy:NSLayoutRelationEqual
  183. toItem:nil
  184. attribute:NSLayoutAttributeNotAnAttribute
  185. multiplier:1.0
  186. constant:48];
  187. [button addConstraint:heightConstraint];
  188. XCTAssertEqual([button.constraints count], 1u);
  189. [button updateConstraints];
  190. XCTAssertEqual([button.constraints count], 2u);
  191. XCTAssertTrue([button.constraints containsObject:heightConstraint]);
  192. }
  193. @end