def confirm_large_stake(value: NU = None, lock_periods: int = None) -> bool: """Interactively confirm a large stake and/or a long stake duration.""" if value and (value > NU.from_tokens(150000)): click.confirm(CONFIRM_LARGE_STAKE_VALUE.format(value=value), abort=True) if lock_periods and (lock_periods > 365): click.confirm(CONFIRM_LARGE_STAKE_DURATION.format(lock_periods=lock_periods), abort=True) return True
def confirm_large_and_or_long_stake(value: NU = None, lock_periods: int = None, economics: BaseEconomics = None) -> bool: """Interactively confirm a large stake and/or a long stake duration.""" if economics and value and (value > (NU.from_nunits(economics.minimum_allowed_locked) * 10)): # > 10x min stake click.confirm(CONFIRM_LARGE_STAKE_VALUE.format(value=value), abort=True) if economics and lock_periods and (lock_periods > economics.maximum_rewarded_periods): # > 1 year lock_days = (lock_periods * economics.hours_per_period) // 24 click.confirm(CONFIRM_LARGE_STAKE_DURATION.format(lock_periods=lock_periods, lock_days=lock_days), abort=True) return True
def test_confirm_large_stake_cli_action(test_emitter, mock_stdin, capsys, value, duration, must_confirm_value, must_confirm_duration): asked_about_value = lambda output: CONFIRM_LARGE_STAKE_VALUE.format( value=value) in output lock_days = (duration * STANDARD_ECONOMICS.hours_per_period) // 24 asked_about_duration = lambda output: CONFIRM_LARGE_STAKE_DURATION.format( lock_periods=duration, lock_days=lock_days) in output # Positive Cases - either do not need to confirm anything, or say yes if must_confirm_value: mock_stdin.line(YES) if must_confirm_duration: mock_stdin.line(YES) result = confirm_large_and_or_long_stake(value=value, lock_periods=duration, economics=STANDARD_ECONOMICS) assert result captured = capsys.readouterr() assert must_confirm_value == asked_about_value(captured.out) assert must_confirm_duration == asked_about_duration(captured.out) assert mock_stdin.empty() if must_confirm_value or must_confirm_duration: # Negative cases - must confirm something and say no if must_confirm_value and must_confirm_duration: # yes to the former but not to the latter mock_stdin.line(YES) mock_stdin.line(NO) else: # no to whatever one we are asked about mock_stdin.line(NO) with pytest.raises(click.Abort): confirm_large_and_or_long_stake(value=value, lock_periods=duration, economics=STANDARD_ECONOMICS) captured = capsys.readouterr() assert must_confirm_value == asked_about_value(captured.out) assert must_confirm_duration == asked_about_duration(captured.out) assert mock_stdin.empty()