ActionSpec.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //
  2. // ActionSpec.swift
  3. // ReactiveCocoa
  4. //
  5. // Created by Justin Spahr-Summers on 2014-12-11.
  6. // Copyright (c) 2014 GitHub. All rights reserved.
  7. //
  8. import Result
  9. import Nimble
  10. import Quick
  11. import ReactiveCocoa
  12. class ActionSpec: QuickSpec {
  13. override func spec() {
  14. describe("Action") {
  15. var action: Action<Int, String, NSError>!
  16. var enabled: MutableProperty<Bool>!
  17. var executionCount = 0
  18. var values: [String] = []
  19. var errors: [NSError] = []
  20. var scheduler: TestScheduler!
  21. let testError = NSError(domain: "ActionSpec", code: 1, userInfo: nil)
  22. beforeEach {
  23. executionCount = 0
  24. values = []
  25. errors = []
  26. enabled = MutableProperty(false)
  27. scheduler = TestScheduler()
  28. action = Action(enabledIf: enabled) { number in
  29. return SignalProducer { observer, disposable in
  30. executionCount += 1
  31. if number % 2 == 0 {
  32. observer.sendNext("\(number)")
  33. observer.sendNext("\(number)\(number)")
  34. scheduler.schedule {
  35. observer.sendCompleted()
  36. }
  37. } else {
  38. scheduler.schedule {
  39. observer.sendFailed(testError)
  40. }
  41. }
  42. }
  43. }
  44. action.values.observeNext { values.append($0) }
  45. action.errors.observeNext { errors.append($0) }
  46. }
  47. it("should be disabled and not executing after initialization") {
  48. expect(action.enabled.value) == false
  49. expect(action.executing.value) == false
  50. }
  51. it("should error if executed while disabled") {
  52. var receivedError: ActionError<NSError>?
  53. action.apply(0).startWithFailed {
  54. receivedError = $0
  55. }
  56. expect(receivedError).notTo(beNil())
  57. if let error = receivedError {
  58. let expectedError = ActionError<NSError>.NotEnabled
  59. expect(error == expectedError) == true
  60. }
  61. }
  62. it("should enable and disable based on the given property") {
  63. enabled.value = true
  64. expect(action.enabled.value) == true
  65. expect(action.executing.value) == false
  66. enabled.value = false
  67. expect(action.enabled.value) == false
  68. expect(action.executing.value) == false
  69. }
  70. describe("execution") {
  71. beforeEach {
  72. enabled.value = true
  73. }
  74. it("should execute successfully") {
  75. var receivedValue: String?
  76. action.apply(0)
  77. .assumeNoErrors()
  78. .startWithNext {
  79. receivedValue = $0
  80. }
  81. expect(executionCount) == 1
  82. expect(action.executing.value) == true
  83. expect(action.enabled.value) == false
  84. expect(receivedValue) == "00"
  85. expect(values) == [ "0", "00" ]
  86. expect(errors) == []
  87. scheduler.run()
  88. expect(action.executing.value) == false
  89. expect(action.enabled.value) == true
  90. expect(values) == [ "0", "00" ]
  91. expect(errors) == []
  92. }
  93. it("should execute with an error") {
  94. var receivedError: ActionError<NSError>?
  95. action.apply(1).startWithFailed {
  96. receivedError = $0
  97. }
  98. expect(executionCount) == 1
  99. expect(action.executing.value) == true
  100. expect(action.enabled.value) == false
  101. scheduler.run()
  102. expect(action.executing.value) == false
  103. expect(action.enabled.value) == true
  104. expect(receivedError).notTo(beNil())
  105. if let error = receivedError {
  106. let expectedError = ActionError<NSError>.ProducerError(testError)
  107. expect(error == expectedError) == true
  108. }
  109. expect(values) == []
  110. expect(errors) == [ testError ]
  111. }
  112. }
  113. }
  114. }
  115. }