there's no reason a store should not open a connection during init if it needs to open any connection to function. delaying connection setup like this makes openStore less deterministic and graceful fallback impossible this caused test failures where the old behaviour was required to ensure test output stability. because of course something like that must happen Change-Id: I946adddee026f1f4c74b4699d730b4d1ac9a5072
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
from testlib.fixtures.nix import Nix
|
|
import pytest
|
|
from typing import NamedTuple
|
|
from textwrap import dedent
|
|
|
|
pytestmark = pytest.mark.no_daemon
|
|
|
|
|
|
class ShouldError(NamedTuple):
|
|
expr: str
|
|
attr: str
|
|
error: str
|
|
|
|
|
|
ERR_CASES: list[ShouldError] = [
|
|
# FIXME(jade): expect-test system for pytest that allows for updating these easily
|
|
ShouldError("{}", '"x', """error: missing closing quote in selection path '"x'"""),
|
|
ShouldError(
|
|
"[]",
|
|
"x",
|
|
"""error: the value being indexed in the selection path 'x' at '' should be a set but is a list: [ ]""",
|
|
),
|
|
ShouldError(
|
|
"{}",
|
|
"1",
|
|
"""error: the expression selected by the selection path '1' should be a list but is a set: { }""",
|
|
),
|
|
ShouldError(
|
|
"{}",
|
|
".",
|
|
"""error: Leading dot in attribute selection path '.' is not allowed! If the attribute name is an empty string, use '\"\".foo.bar'""",
|
|
),
|
|
ShouldError(
|
|
"{}",
|
|
"bla..blub",
|
|
"""error: consecutive dots not allowed in selection path 'bla..blub', use 'foo."".bar' to denote an empty attribute name""",
|
|
),
|
|
ShouldError(
|
|
"[]", "1", """error: list index 1 in selection path '1' is out of range for list [ ]"""
|
|
),
|
|
ShouldError(
|
|
"{ x.y = { z = 2; a = 3; }; }",
|
|
"x.y.c",
|
|
dedent("""\
|
|
error: attribute 'c' in selection path 'x.y.c' not found inside path 'x.y', whose contents are: { a = 3; z = 2; }
|
|
Did you mean one of a or z?"""),
|
|
),
|
|
]
|
|
|
|
|
|
# I do not know why it does this, but I guess it makes sense as allowing a tool
|
|
# to pass -A unconditionally and then allow a blank attribute to mean the whole
|
|
# thing
|
|
def test_attrpath_accepts_empty_attr_as_no_attr(nix: Nix):
|
|
assert (
|
|
nix.nix_instantiate(["--eval", "--expr", "{}", "-A", ""]).run().ok().stdout_plain == "{ }"
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(("expr", "attr", "error"), ERR_CASES)
|
|
def test_attrpath_error(nix: Nix, expr: str, attr: str, error: str):
|
|
res = nix.nix_instantiate(["--eval", "--expr", expr, "-A", attr]).run()
|
|
|
|
assert res.expect(1).stderr_plain == error
|