async def test_completion_candidates_for_columns_option(self): self.localcfg['columns.torrents'] = SimpleNamespace(options=('a', 'b', 'c'), sep=' , ') await self.assert_completion_candidates(ListTorrentsCmd, Args(('ls', '--columns', 'foo'), curarg_index=2), exp_cands=('a', 'b', 'c'), exp_curarg_seps=(',',)) await self.assert_completion_candidates(ListTorrentsCmd, Args(('ls', '--columns', 'foo', 'bar'), curarg_index=2), exp_cands=('a', 'b', 'c'), exp_curarg_seps=(',',)) await self.assert_completion_candidates(ListTorrentsCmd, Args(('ls', 'bar', '--columns', 'foo'), curarg_index=3), exp_cands=('a', 'b', 'c'), exp_curarg_seps=(',',))
async def test_completion_candidates_for_posargs(self, mock_fs_path): mock_fs_path.return_value = Candidates(('a', 'b', 'c')) await self.assert_completion_candidates(AddTorrentsCmd, Args(('add', 'foo'), curarg_index=1), exp_cands=('a', 'b', 'c')) mock_fs_path.assert_called_once_with('foo', glob='*.torrent') mock_fs_path.reset_mock() await self.assert_completion_candidates(AddTorrentsCmd, Args(('add', 'foo', 'bar'), curarg_index=2), exp_cands=('a', 'b', 'c')) mock_fs_path.assert_called_once_with('bar', glob='*.torrent')
async def test_completion_candidates_for_posargs(self, mock_torrent_filter): mock_torrent_filter.return_value = Candidates(('a', 'b', 'c')) await self.assert_completion_candidates(ListTorrentsCmd, Args(('ls', 'foo'), curarg_index=1), exp_cands=('a', 'b', 'c')) mock_torrent_filter.assert_called_once_with('foo') mock_torrent_filter.reset_mock() await self.assert_completion_candidates(ListTorrentsCmd, Args(('ls', 'foo', 'bar'), curarg_index=2), exp_cands=('a', 'b', 'c')) mock_torrent_filter.assert_called_once_with('bar')
async def test_completion_candidates_for_posargs(self, mock_fs_path, mock_torrent_filter): mock_torrent_filter.return_value = Candidates(('a', 'b', 'c')) cands = await RemoveTorrentsCmd.completion_candidates(Args(('remove', 'foo'), curarg_index=1)) mock_torrent_filter.assert_called_once_with('foo') self.assertEqual(cands, Candidates(('a', 'b', 'c'))) mock_torrent_filter.reset_mock() mock_torrent_filter.return_value = Candidates(('a', 'b', 'c')) cands = await RemoveTorrentsCmd.completion_candidates(Args(('remove', 'foo', 'bar'), curarg_index=2)) mock_torrent_filter.assert_called_once_with('bar') self.assertEqual(cands, Candidates(('a', 'b', 'c')))
async def test_completion_candidates__subcmd_parameters( self, mock_commands, mock_for_args): mock_for_args.return_value = Candidates(('foo', 'bar', 'baz')) args = Args(('tab', '--bar', 'a', '-b', 'c'), curarg_index=4) await self.assert_completion_candidates(TabCmd, args, exp_cands=('foo', 'bar', 'baz')) mock_for_args.assert_called_once_with( Args(('a', '-b', 'c'), curarg_index=2, curarg_curpos=0)) mock_commands.assert_not_called()
def test_setting_is_an_Option(self, mock_rcfg, mock_lcfg): for mock_cfg,setting_name in ((mock_lcfg, 'foo'), (mock_rcfg, 'srv.foo')): mock_cfg.__iter__.return_value = (setting_name,) mock_cfg.__contains__.return_value = True mock_cfg.__getitem__.return_value = usertypes.Option('b', options=('a', 'b', 'c')) cmdline = Args((setting_name, '_', '_'), curarg_index=1, curarg_curpos=0) self.assertEqual(candidates.setting_values(cmdline), Candidates(('a', 'b', 'c'), label='%s options' % setting_name)) cmdline = Args((setting_name, '_', '_'), curarg_index=2, curarg_curpos=0) self.assertFalse(candidates.setting_values(cmdline))
def test_setting_is_a_Bool(self, mock_rcfg, mock_lcfg): for mock_cfg,setting_name in ((mock_lcfg, 'foo'), (mock_rcfg, 'srv.foo')): mock_cfg.__iter__.return_value = (setting_name,) mock_cfg.__contains__.return_value = True mock_cfg.__getitem__.return_value = usertypes.Bool('1', true=('1',), false=('0',)) cmdline = Args((setting_name, '_', '_'), curarg_index=1, curarg_curpos=0) cands = candidates.setting_values(cmdline) exp_cands = Candidates(('1', '0'), label='%s options' % setting_name) self.assertEqual(cands, exp_cands) cmdline = Args((setting_name, '_', '_'), curarg_index=2, curarg_curpos=0) self.assertFalse(candidates.setting_values(cmdline))
async def test_completion_candidates_when_completing_list_values( self, mock_candidates): mock_candidates.setting_names.return_value = Candidates(('foo', 'bar')) mock_candidates.setting_values.return_value = Candidates( ('a', 'b', 'c')) await self.assert_completion_candidates( SetCmd, Args(('set', 'foo', '_', '_', '_'), curarg_index=2), exp_cands=('a', 'b', 'c')) await self.assert_completion_candidates( SetCmd, Args(('set', 'bar', '_', '_', '_'), curarg_index=3), exp_cands=('a', 'b', 'c'))
async def test_completion_candidates_on_first_argument( self, mock_candidates): mock_candidates.fs_path.return_value = Candidates(('a', 'b', 'c')) await self.assert_completion_candidates(RcCmd, Args(('rc', 'hey', 'ho'), curarg_index=1), exp_cands=('a', 'b', 'c')) mock_candidates.fs_path.assert_called_once_with( 'hey', base=os.path.dirname(self.mock_default_rcfile)) await self.assert_completion_candidates(RcCmd, Args(('rc', 'hey', 'ho'), curarg_index=2), exp_cands=None)
async def test_completion_candidates__subcmd_name(self, mock_commands, mock_for_args): mock_commands.return_value = Candidates(('foo', 'bar', 'baz')) for args in ( Args(('tab', 'a', '-b', 'c'), curarg_index=1), Args(('tab', '-c', 'foo', 'a', '-b', 'c'), curarg_index=3), Args(('tab', '-c', 'foo', '-t', 'bar', 'a', '-b', 'c'), curarg_index=5), ): await self.assert_completion_candidates(TabCmd, args, exp_cands=('foo', 'bar', 'baz')) mock_commands.assert_called_with() mock_for_args.assert_not_called()
async def test_completion_candidates_for_path_option(self, mock_fs_path): mock_fs_path.return_value = Candidates(('a', 'b', 'c')) self.remotecfg['path.complete'] = '/bar/baz' await self.assert_completion_candidates(AddTorrentsCmd, Args(('add', '--path', 'foo', 'x.torrent'), curarg_index=2), exp_cands=('a', 'b', 'c')) mock_fs_path.assert_called_once_with('foo', base='/bar/baz', directories_only=True) mock_fs_path.reset_mock() await self.assert_completion_candidates(AddTorrentsCmd, Args(('add', 'x.torrent', '--path', 'foo'), curarg_index=3), exp_cands=('a', 'b', 'c')) mock_fs_path.assert_called_once_with('foo', base='/bar/baz', directories_only=True) mock_fs_path.reset_mock() await self.assert_completion_candidates(AddTorrentsCmd, Args(('add', 'x.torrent', 'y.torrent', '--path', 'foo'), curarg_index=4), exp_cands=('a', 'b', 'c')) mock_fs_path.assert_called_once_with('foo', base='/bar/baz', directories_only=True)
async def test_completion_candidates_for_sort_option( self, mock_candidates): mock_candidates.sort_orders.return_value = Candidates( ('mock sort orders', )) await self.assert_completion_candidates( SetCmd, Args(('set', '--sort', ''), curarg_index=2), exp_cands=('mock sort orders', )) await self.assert_completion_candidates( SetCmd, Args(('set', '--sort', 'b'), curarg_index=2, curarg_curpos=1), exp_cands=('mock sort orders', )) await self.assert_completion_candidates( SetCmd, Args(('set', '--sort', 'bar'), curarg_index=2, curarg_curpos=2), exp_cands=('mock sort orders', ))
async def test_completion_candidates__own_parameters( self, mock_completion_candidates_opts, mock_commands, mock_for_args): mock_completion_candidates_opts.return_value = Candidates( ('foo', 'bar', 'baz')) for args in (Args(('tab', '-c', 'foo', '-t', '', 'a', '-b', 'c'), curarg_index=4), Args(('tab', '-c', 'foo', '-t', 'bar', 'a', '-b', 'c'), curarg_index=2, curarg_curpos=2)): await self.assert_completion_candidates(TabCmd, args, exp_cands=('foo', 'bar', 'baz')) mock_completion_candidates_opts.assert_called_with(args) mock_for_args.assert_not_called() mock_commands.assert_not_called()
async def test_completion_candidates__no_subcmd( self, mock_completion_candidates_opts, mock_commands, mock_for_args): mock_completion_candidates_opts.return_value = Candidates( ('foo', 'bar', 'baz')) for args in (Args(('bind', ), curarg_index=0), Args(('bind', '-d', 'bar'), curarg_index=1), Args(('bind', '-d', 'bar'), curarg_index=2), Args(('bind', '-c', 'foo', '-d', 'bar'), curarg_index=3), Args(('bind', '-c', 'foo', '-d', 'bar'), curarg_index=4)): await self.assert_completion_candidates(BindCmd, args, exp_cands=('foo', 'bar', 'baz')) mock_completion_candidates_opts.assert_called_with(args) mock_for_args.assert_not_called() mock_commands.assert_not_called()
async def test_completion_candidates__subcmd_parameters( self, mock_commands, mock_for_args): mock_for_args.return_value = Candidates(('foo', 'bar', 'baz')) for args in (Args(('bind', 'alt-x', 'a', '-b', 'c'), curarg_index=4), Args(('bind', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), curarg_index=6), Args(('bind', '-c', 'foo', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), curarg_index=8)): await self.assert_completion_candidates(BindCmd, args, exp_cands=('foo', 'bar', 'baz')) mock_for_args.assert_called_once_with( Args(('a', '-b', 'c'), curarg_index=2)) mock_for_args.reset_mock() mock_commands.assert_not_called()
async def test_completion_candidates_for_column_option( self, mock_candidates): mock_candidates.column_names.return_value = Candidates( ('mock columns', )) await self.assert_completion_candidates(SetCmd, Args(('set', '--columns', ''), curarg_index=2), exp_cands=('mock columns', )) await self.assert_completion_candidates(SetCmd, Args(('set', '--columns', 'f'), curarg_index=2, curarg_curpos=1), exp_cands=('mock columns', )) await self.assert_completion_candidates( SetCmd, Args(('set', '--columns', 'foo'), curarg_index=2, curarg_curpos=2), exp_cands=('mock columns', ))
async def test_TUI_completion_candidates_for_posargs_with_two_args_on_first_arg(self, mock_fs_path, mock_torrent_filter): from stig.commands.tui import MoveTorrentsCmd mock_torrent_filter.return_value = (Candidates(('a', 'b', 'c')),) cands = await MoveTorrentsCmd.completion_candidates(Args(('move', 'foo', 'bar'), curarg_index=1)) mock_torrent_filter.assert_called_once_with('foo') mock_fs_path.assert_not_called() self.assertEqual(cands, (Candidates(('a', 'b', 'c')),))
async def test_completion_candidates(self, mock_candidates): mock_candidates.setting_names.return_value = Candidates( ('a', 'b', 'c')) await self.assert_completion_candidates(ResetCmd, Args(('reset', 'hey', 'ho'), curarg_index=2), exp_cands=('a', 'b', 'c')) mock_candidates.setting_names.assert_called_once_with()
async def test_TUI_completion_candidates_for_posargs_with_two_args_on_second_arg(self, mock_fs_path, mock_torrent_filter): from stig.commands.tui import MoveTorrentsCmd mock_fs_path.return_value = Candidates(('d', 'e', 'f')) self.remotecfg['path.complete'] = '/some/path/' cands = await MoveTorrentsCmd.completion_candidates(Args(('move', 'foo', 'bar'), curarg_index=2)) mock_torrent_filter.assert_not_called() mock_fs_path.assert_called_once_with('bar', base=self.remotecfg['path.complete'], directories_only=True) self.assertEqual(cands, Candidates(('d', 'e', 'f')))
async def test_completion_candidates_on_any_other_argument( self, mock_candidates): mock_candidates.fs_path.return_value = Candidates( ('foo', 'bar', 'baz')) await self.assert_completion_candidates(RcCmd, Args(('rc', 'hey', 'ho'), curarg_index=2), exp_cands=None) mock_candidates.fs_path.assert_not_called()
async def test_completion_candidates__subcmd_options( self, mock_commands, mock_for_args): mock_for_args.return_value = Candidates(('--foo', '--bar', '--baz')) for args, i1, i2 in ((('bind', 'alt-x', 'a', '-b', 'c'), 3, 1), (('bind', 'alt-x', 'a', '-b', 'c'), 4, 2), (('bind', '-c', 'foo', 'alt-x', 'a', '-b', 'c'), 5, 1), (('bind', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), 6, 2), (('bind', '-c', 'foo', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), 7, 1), (('bind', '-c', 'foo', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), 8, 2)): await self.assert_completion_candidates( BindCmd, Args(args, curarg_index=i1), exp_cands=('--foo', '--bar', '--baz')) mock_for_args.assert_called_with( Args(('a', '-b', 'c'), curarg_index=i2, curarg_curpos=0)) mock_commands.assert_not_called()
def test_unknown_setting(self, mock_rcfg, mock_lcfg): mock_lcfg.__iter__.return_value = ('foo', 'bar', 'baz') mock_rcfg.__iter__.return_value = ('Foo', 'Bar', 'Baz') for args in (('foo', 'bar', 'baz'), ('foo', 'bar', 'baz'), ('foo', 'bar', 'baz')): for curarg_index in (0, 1, 2): for curarg_curpos in (0, 1, 2, 3): cmdline = Args(args, curarg_index=curarg_index, curarg_curpos=curarg_curpos) self.assertFalse(candidates.setting_values(cmdline))
async def test_completion_candidates__own_options( self, mock_completion_candidates_opts, mock_commands, mock_for_args): mock_completion_candidates_opts.return_value = Candidates( ('--context', '--description')) for args in (Args(('bind', '-c', 'foo', 'alt-x', 'a', '-b', 'c'), curarg_index=1), Args(('bind', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), curarg_index=1), Args(('bind', '-c', 'foo', '-d', 'bar', 'alt-x', 'a', '-b', 'c'), curarg_index=3), Args(('bind', '-c', 'foo', 'alt-x', '-d', 'bar', 'a', '-b', 'c'), curarg_index=4)): await self.assert_completion_candidates( BindCmd, args, exp_cands=('--context', '--description')) mock_completion_candidates_opts.assert_called_with(args) mock_for_args.assert_not_called() mock_commands.assert_not_called()
def test_setting_is_a_Tuple(self, mock_rcfg, mock_lcfg): for mock_cfg,setting_name in ((mock_lcfg, 'foo'), (mock_rcfg, 'srv.foo')): mock_cfg.__iter__.return_value = (setting_name,) mock_cfg.__contains__.return_value = True mock_cfg.__getitem__.return_value = usertypes.Tuple('a', 'b', options=('a', 'b', 'c')) for i in (1, 2, 3): cmdline = Args((setting_name, '_', '_', '_'), curarg_index=i, curarg_curpos=0) cands = candidates.setting_values(cmdline) exp_cands = Candidates(('a', 'b', 'c'), label='%s options' % setting_name, curarg_seps=(',',)) self.assertEqual(cands, exp_cands)
async def test_no_completion_candidates_for_settings_or_names_with_option_given( self, mock_candidates): mock_candidates.setting_names.return_value = Candidates(('foo', 'bar')) mock_candidates.setting_values.return_value = Candidates( ('a', 'b', 'c')) await self.assert_completion_candidates( SetCmd, Args(('set', '--sort', 'foo', '_'), curarg_index=3), exp_cands=None) await self.assert_completion_candidates( SetCmd, Args(('set', '_', '--sort', 'foo'), curarg_index=1), exp_cands=None) await self.assert_completion_candidates(SetCmd, Args(('set', '-c', 'foo', '_'), curarg_index=3), exp_cands=None) await self.assert_completion_candidates(SetCmd, Args(('set', '_', '-c'), curarg_index=1), exp_cands=None)
async def test_completion_candidates_for_options_or_setting_names( self, mock_candidates): mock_candidates.setting_names.return_value = Candidates( ('mock settings', )) mock_candidates.setting_values.return_value = Candidates( ('mock values', )) await self.assert_completion_candidates( SetCmd, Args(('set', '-'), curarg_index=1, curarg_curpos=1), exp_cands=(('--columns', '--sort'), ('mock settings', ))) await self.assert_completion_candidates(SetCmd, Args(('set', 'foo', '-'), curarg_index=2, curarg_curpos=1), exp_cands=('mock values', )) await self.assert_completion_candidates(SetCmd, Args( ('set', 'foo', '-', 'bar'), curarg_index=3, curarg_curpos=2), exp_cands=('mock values', ))
async def test_completion_candidates_torrent_filter(self, mock_candidates): mock_candidates.torrent_filter.return_value = Candidates( ('a', 'b', 'c')) await self.assert_completion_candidates( RateLimitCmd, Args(('ratelimit', 'up', '10MB', '_'), curarg_index=3), exp_cands=('a', 'b', 'c')) await self.assert_completion_candidates( RateLimitCmd, Args(('ratelimit', 'up', '10MB', '_', '_'), curarg_index=4), exp_cands=('a', 'b', 'c')) await self.assert_completion_candidates( RateLimitCmd, Args(('ratelimit', 'up', '10MB', '_', '_'), curarg_index=3), exp_cands=('a', 'b', 'c')) await self.assert_completion_candidates( RateLimitCmd, Args(('ratelimit', '-q', 'up', '10MB', '_', '_'), curarg_index=4), exp_cands=('a', 'b', 'c')) await self.assert_completion_candidates( RateLimitCmd, Args(('ratelimit', 'up', '-q', '10MB', '_', '_'), curarg_index=5), exp_cands=('a', 'b', 'c')) await self.assert_completion_candidates( RateLimitCmd, Args(('ratelimit', 'up', '10MB', '-q', '_', '_'), curarg_index=4), exp_cands=('a', 'b', 'c'))
async def test_no_completion_candidates_if_sort_or_columns_options_given( self): for opt in ('--columns', '--sort'): await self.assert_completion_candidates( SetCmd, Args(('set', opt, 'name', '_', '_'), curarg_index=3), exp_cands=None) await self.assert_completion_candidates( SetCmd, Args(('set', opt, 'name', '_', '_'), curarg_index=4), exp_cands=None) await self.assert_completion_candidates( SetCmd, Args(('set', '_', opt, 'name', '_'), curarg_index=1), exp_cands=None) await self.assert_completion_candidates( SetCmd, Args(('set', '_', opt, 'name', '_'), curarg_index=4), exp_cands=None) await self.assert_completion_candidates( SetCmd, Args(('set', '_', '_', opt, 'name'), curarg_index=1), exp_cands=None) await self.assert_completion_candidates( SetCmd, Args(('set', '_', '_', opt, 'name'), curarg_index=2), exp_cands=None)
def test_setting_is_a_Path(self, mock_fs_path, mock_isdir, mock_rcfg, mock_lcfg): for mock_cfg,setting_name in ((mock_lcfg, 'foo'), (mock_rcfg, 'srv.foo')): for mocking_directory in (True, False): mock_isdir.return_value = mocking_directory mock_cfg.__iter__.return_value = (setting_name,) mock_cfg.__contains__.return_value = True mock_cfg.__getitem__.return_value = usertypes.Path('mock/path', base='/mockbase/') cmdline = Args((setting_name, 'abcdef'), curarg_index=1, curarg_curpos=3) candidates.setting_values(cmdline) mock_isdir.assert_called_with('mock/path') mock_fs_path.assert_called_with('abc', base='/mockbase/', directories_only=mocking_directory)
async def test_single_file_in_torrent(self, mock_torrents, mock_find_subtree): mock_find_subtree.return_value = None mock_torrent_list = [{'name': 'Mock Torrent', 'files': MagicMock()}] mock_torrents.return_value = SimpleNamespace( success=True, torrents=mock_torrent_list) cands = await candidates.torrent_path(Arg('id=foo/a/b/c', curpos=10)) self.assert_no_candidates(cands) mock_torrents.assert_called_once_with('id=foo', keys=('files', ), from_cache=True) mock_find_subtree.assert_called_once_with( mock_torrent_list[0], Args(('a', 'b'), curarg_index=1, curarg_curpos=1))