ActionSheetPopoverPresenterTests.swift 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. //
  2. // ActionSheetPopoverPresenterTests.swift
  3. // SheeeeeeeeetTests
  4. //
  5. // Created by Daniel Saidi on 2018-10-18.
  6. // Copyright © 2018 Daniel Saidi. All rights reserved.
  7. //
  8. import Quick
  9. import Nimble
  10. @testable import Sheeeeeeeeet
  11. class ActionSheetPopoverPresenterTests: QuickSpec {
  12. override func spec() {
  13. var presenter: ActionSheetPopoverPresenter!
  14. var sheet: MockActionSheet!
  15. var headerView: UIView!
  16. var headerViewContainer: ActionSheetHeaderView!
  17. var itemView: ActionSheetItemTableView!
  18. var buttonView: ActionSheetButtonTableView!
  19. beforeEach {
  20. let items: [ActionSheetItem] = [
  21. ActionSheetSingleSelectItem(title: "item 1", isSelected: true),
  22. ActionSheetCancelButton(title: "cancel"),
  23. ActionSheetOkButton(title: "ok"),
  24. ActionSheetMultiSelectItem(title: "item 2", isSelected: true)
  25. ]
  26. headerView = UIView(frame: .zero)
  27. headerViewContainer = ActionSheetHeaderView(frame: .zero)
  28. itemView = ActionSheetItemTableView(frame: .zero)
  29. buttonView = ActionSheetButtonTableView(frame: .zero)
  30. sheet = MockActionSheet(items: items) { (_, _) in }
  31. sheet.headerViewContainer = headerViewContainer
  32. sheet.headerView = headerView
  33. sheet.itemsTableView = itemView
  34. sheet.buttonsTableView = buttonView
  35. presenter = ActionSheetPopoverPresenter()
  36. presenter.actionSheet = sheet
  37. }
  38. describe("background tap dismissal") {
  39. it("is enabled by default") {
  40. expect(presenter.isDismissableWithTapOnBackground).to(beTrue())
  41. }
  42. }
  43. describe("dismissing") {
  44. it("completes dismissal directly if action sheet has no presenting view controller") {
  45. var count = 0
  46. presenter.dismiss { count += 1 }
  47. expect(count).to(equal(1))
  48. expect(presenter.actionSheet).to(beNil())
  49. }
  50. it("completes dismissal after presenting view controller has finished dismissing") {
  51. var count = 0
  52. let vc = MockViewController()
  53. sheet.presentingViewController = vc
  54. presenter.dismiss { count += 1 }
  55. expect(vc.dismissInvokeCount).to(equal(1))
  56. expect(vc.dismissInvokeAnimateds).to(equal([true]))
  57. expect(vc.dismissInvokeCompletions.count).to(equal(1))
  58. expect(count).to(equal(0))
  59. expect(presenter.actionSheet).toNot(beNil())
  60. vc.completeDismissal()
  61. expect(count).to(equal(1))
  62. expect(presenter.actionSheet).to(beNil())
  63. }
  64. }
  65. describe("presenting action sheet from view") {
  66. var vc: MockViewController!
  67. var view: UIView!
  68. var completion: (() -> ())!
  69. beforeEach {
  70. vc = MockViewController()
  71. view = UIView(frame: CGRect(x: 1, y: 2, width: 3, height: 4))
  72. completion = {}
  73. presenter.present(sheet: sheet, in: vc, from: view, completion: completion)
  74. }
  75. it("sets up sheet for popover presentation") {
  76. expect(sheet.items.count).to(equal(3))
  77. expect(sheet.buttons.count).to(equal(0))
  78. expect(sheet.modalPresentationStyle).to(equal(.popover))
  79. }
  80. it("sets up popover presentation controller") {
  81. expect(presenter.popover?.delegate).to(be(presenter))
  82. expect(presenter.popover?.sourceView).to(be(view))
  83. expect(presenter.popover?.sourceRect).to(equal(view.bounds))
  84. }
  85. it("performs presentation") {
  86. expect(vc.presentInvokeCount).to(equal(1))
  87. expect(vc.presentInvokeVcs).to(equal([sheet]))
  88. expect(vc.presentInvokeAnimateds).to(equal([true]))
  89. expect(vc.presentInvokeCompletions.count).to(equal(1))
  90. }
  91. }
  92. describe("presenting action sheet from bar button item") {
  93. var vc: MockViewController!
  94. var item: UIBarButtonItem!
  95. var completion: (() -> ())!
  96. beforeEach {
  97. vc = MockViewController()
  98. item = UIBarButtonItem(customView: UIView(frame: .zero))
  99. completion = {}
  100. presenter.present(sheet: sheet, in: vc, from: item, completion: completion)
  101. }
  102. it("sets up sheet for popover presentation") {
  103. expect(sheet.items.count).to(equal(3))
  104. expect(sheet.buttons.count).to(equal(0))
  105. expect(sheet.modalPresentationStyle).to(equal(.popover))
  106. }
  107. it("sets up popover presentation controller") {
  108. expect(presenter.popover?.delegate).to(be(presenter))
  109. expect(presenter.popover?.barButtonItem).to(be(item))
  110. expect(presenter.popover?.sourceRect).to(equal(.zero))
  111. }
  112. it("performs presentation") {
  113. expect(vc.presentInvokeCount).to(equal(1))
  114. expect(vc.presentInvokeVcs).to(equal([sheet]))
  115. expect(vc.presentInvokeAnimateds).to(equal([true]))
  116. expect(vc.presentInvokeCompletions.count).to(equal(1))
  117. }
  118. }
  119. describe("refreshing action sheet") {
  120. beforeEach {
  121. sheet.itemsTableView?.backgroundColor = .red
  122. presenter.present(sheet: sheet, in: UIViewController(), from: UIView()) {}
  123. presenter.refreshActionSheet()
  124. }
  125. it("hides unused views") {
  126. expect(sheet.buttonsTableView?.isHidden).to(beTrue())
  127. expect(sheet.headerViewContainer?.isHidden).to(beTrue())
  128. }
  129. it("resizes popover") {
  130. expect(sheet.preferredContentSize.height).to(equal(150))
  131. }
  132. it("applies color to popover arrow") {
  133. expect(presenter.popover?.backgroundColor).to(equal(.red))
  134. }
  135. }
  136. describe("popover should dismiss") {
  137. var popover: UIPopoverPresentationController!
  138. var presenting: MockViewController!
  139. var dismissEventCount: Int!
  140. beforeEach {
  141. popover = UIPopoverPresentationController(presentedViewController: UIViewController(), presenting: nil)
  142. presenting = MockViewController()
  143. sheet.presentingViewController = presenting
  144. dismissEventCount = 0
  145. presenter.events.didDismissWithBackgroundTap = { dismissEventCount += 1 }
  146. }
  147. it("aborts and returns false if background tap is disabled") {
  148. presenter.isDismissableWithTapOnBackground = false
  149. let result = presenter.popoverPresentationControllerShouldDismissPopover(popover)
  150. expect(result).to(beFalse())
  151. expect(dismissEventCount).to(equal(0))
  152. expect(presenting.dismissInvokeCount).to(equal(0))
  153. }
  154. it("completes and returns false if background tap is enabled") {
  155. presenter.isDismissableWithTapOnBackground = true
  156. let result = presenter.popoverPresentationControllerShouldDismissPopover(popover)
  157. expect(result).to(beFalse())
  158. expect(dismissEventCount).to(equal(1))
  159. expect(presenting.dismissInvokeCount).to(equal(1))
  160. }
  161. }
  162. describe("setting up sheet for popover presentation") {
  163. beforeEach {
  164. presenter.setupSheetForPresentation(sheet)
  165. }
  166. it("sets popover style") {
  167. expect(sheet.modalPresentationStyle).to(equal(.popover))
  168. }
  169. it("moves non-cancel buttons last into items group") {
  170. expect(sheet.items.count).to(equal(3))
  171. expect(sheet.buttons.count).to(equal(0))
  172. expect(sheet.items[0] is ActionSheetSingleSelectItem).to(beTrue())
  173. expect(sheet.items[1] is ActionSheetMultiSelectItem).to(beTrue())
  174. expect(sheet.items[2] is ActionSheetOkButton).to(beTrue())
  175. }
  176. }
  177. }
  178. }