diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 14c4849b7..b8c9c1e05 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -510,7 +510,7 @@ class FlagList(List): # Single value completions for value in valid_values: desc = valid_values.descriptions.get(value, "") - out.append((value, desc)) + out.append((json.dumps([value]), desc)) combinables = self.combinable_values if combinables is None: @@ -518,7 +518,7 @@ class FlagList(List): # Generate combinations of each possible value combination for size in range(2, len(combinables) + 1): for combination in itertools.combinations(combinables, size): - out.append((','.join(combination), '')) + out.append((json.dumps(combination), '')) return out diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index 5daf63294..d9845ba03 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -278,6 +278,14 @@ class TestAll: with pytest.raises(configexc.ValidationError): klass().to_py(object()) + def test_completion_validity(self, klass): + """Make sure all completions are actually valid values.""" + typ = klass() + completions = typ.complete() + if completions is not None: + for value, _desc in completions: + typ.from_str(value) + class TestBaseType: @@ -640,24 +648,24 @@ class TestFlagList: def test_complete(self, klass): """Test completing by doing some samples.""" typ = klass(set_valid_values=True) - completions = [e[0] for e in typ.complete()] - assert 'foo' in completions - assert 'bar' in completions - assert 'baz' in completions - assert 'foo,bar' in completions + completions = [json.loads(e[0]) for e in typ.complete()] + assert ['foo'] in completions + assert ['bar'] in completions + assert ['baz'] in completions + assert ['foo', 'bar'] in completions for val in completions: - assert 'baz,' not in val - assert ',baz' not in val + if len(val) > 1: + assert 'baz' not in val def test_complete_all_valid_values(self, klass): typ = klass(set_valid_values=True) typ.combinable_values = None - completions = [e[0] for e in typ.complete()] - assert 'foo' in completions - assert 'bar' in completions - assert 'baz' in completions - assert 'foo,bar' in completions - assert 'foo,baz' in completions + completions = [json.loads(e[0]) for e in typ.complete()] + assert ['foo'] in completions + assert ['bar'] in completions + assert ['baz'] in completions + assert ['foo', 'bar'] in completions + assert ['foo', 'baz'] in completions def test_complete_no_valid_values(self, klass): assert klass().complete() is None @@ -1910,18 +1918,6 @@ class TestConfirmQuit: with pytest.raises(configexc.ValidationError): klass().to_py(val) - def test_complete(self, klass): - """Test completing by doing some samples.""" - completions = [e[0] for e in klass().complete()] - assert 'always' in completions - assert 'never' in completions - assert 'multiple-tabs,downloads' in completions - for val in completions: - assert 'always,' not in val - assert ',always' not in val - assert 'never,' not in val - assert ',never' not in val - class TestTimestampTemplate: