def test_transition_events(storage): """It should call the appropriate functions on every state transition.""" class Listener(CircuitBreakerListener): def __init__(self): self.out = [] def state_change(self, breaker, old, new): assert breaker self.out.append((old.state, new.state)) listener = Listener() breaker = CircuitBreaker(listeners=(listener, ), state_storage=storage) assert CircuitBreakerState.CLOSED == breaker.current_state breaker.open() assert CircuitBreakerState.OPEN == breaker.current_state breaker.half_open() assert CircuitBreakerState.HALF_OPEN == breaker.current_state breaker.close() assert CircuitBreakerState.CLOSED == breaker.current_state assert [(CircuitBreakerState.CLOSED, CircuitBreakerState.OPEN), (CircuitBreakerState.OPEN, CircuitBreakerState.HALF_OPEN), (CircuitBreakerState.HALF_OPEN, CircuitBreakerState.CLOSED) ] == listener.out
def test_successful_call_when_half_open(storage): """It should close the circuit when a call succeeds in half-open state.""" breaker = CircuitBreaker(state_storage=storage) breaker.half_open() assert 0 == breaker.fail_counter assert CircuitBreakerState.HALF_OPEN == breaker.current_state # Circuit should open assert breaker.call(func_succeed) assert 0 == breaker.fail_counter assert CircuitBreakerState.CLOSED == breaker.current_state
def test_failed_call_when_half_open(storage): """It should open the circuit when a call fails in half-open state.""" breaker = CircuitBreaker(state_storage=storage) breaker.half_open() assert 0 == breaker.fail_counter assert CircuitBreakerState.HALF_OPEN == breaker.current_state with raises(CircuitBreakerError): breaker.call(func_exception) assert 1 == breaker.fail_counter assert CircuitBreakerState.OPEN == breaker.current_state