Skip to content

Commit 7abf3c7

Browse files
committed
Add CLI tests
1 parent c86cb9d commit 7abf3c7

File tree

3 files changed

+102
-27
lines changed

3 files changed

+102
-27
lines changed

tests/test_cli.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import pytest
2+
3+
import ulid.__main__ as cli
4+
from ulid import ULID
5+
6+
7+
@pytest.mark.parametrize("option", ["", "uuid", "uuid4", "hex", "int", "timestamp", "datetime"])
8+
def test_parse_show(option: str):
9+
ulid = ULID()
10+
argv = ["show", f"--{option}", str(ulid)]
11+
output = cli.main(argv)
12+
if option == "uuid":
13+
assert output == str(ulid.to_uuid())
14+
elif option == "uuid4":
15+
assert output == str(ulid.to_uuid4())
16+
elif option == "hex":
17+
assert output == ulid.hex
18+
elif option == "int":
19+
assert output == str(int(ulid))
20+
elif option == "timestamp":
21+
assert output == str(ulid.timestamp)
22+
elif option == "datetime":
23+
assert output == ulid.datetime.isoformat()
24+
else:
25+
assert str(ulid) in output
26+
assert ulid.hex in output
27+
assert str(int(ulid)) in output
28+
assert str(ulid.timestamp) in output
29+
assert str(ulid.datetime.isoformat()) in output
30+
31+
32+
@pytest.mark.parametrize(
33+
"option",
34+
[
35+
"",
36+
"from-uuid",
37+
"from-str",
38+
"from-hex",
39+
"from-int",
40+
"from-timestamp",
41+
"from-datetime",
42+
],
43+
)
44+
def test_build(option: str):
45+
ulid = ULID()
46+
value: str
47+
includes_randomness = True
48+
includes_timestamp = True
49+
if option.endswith("uuid"):
50+
value = str(ulid.to_uuid())
51+
elif option.endswith("str"):
52+
value = str(ulid)
53+
elif option.endswith("hex"):
54+
value = ulid.hex
55+
elif option.endswith("int"):
56+
value = str(int(ulid))
57+
elif option.endswith("timestamp"):
58+
value = str(ulid.timestamp)
59+
includes_randomness = False
60+
elif option.endswith("datetime"):
61+
value = ulid.datetime.isoformat()
62+
includes_randomness = False
63+
else:
64+
includes_timestamp = False
65+
includes_randomness = False
66+
67+
argv = ["build"]
68+
if option:
69+
argv += [f"--{option}", value]
70+
output = cli.main(argv)
71+
72+
if includes_randomness and includes_timestamp:
73+
assert output == str(ulid)
74+
75+
ulid_out = ULID.from_str(output)
76+
if includes_timestamp:
77+
assert ulid_out.datetime == ulid.datetime

ulid/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
from ulid import constants
1717

1818

19-
if TYPE_CHECKING:
19+
if TYPE_CHECKING: # pragma: no cover
2020
from pydantic import GetCoreSchemaHandler
2121
from pydantic import ValidatorFunctionWrapHandler
2222
from pydantic_core import CoreSchema
2323

2424
try:
2525
from importlib.metadata import version
26-
except ImportError:
26+
except ImportError: # pragma: no cover
2727
from importlib_metadata import version # type: ignore
2828

2929

ulid/__main__.py

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ def make_parser(prog: str | None = None) -> argparse.ArgumentParser:
9292
return parser
9393

9494

95-
def main(argv: Sequence[str], prog: str | None = None) -> None:
95+
def main(argv: Sequence[str], prog: str | None = None) -> str:
9696
args = make_parser(prog).parse_args(argv)
97-
args.func(args)
97+
return args.func(args)
9898

9999

100100
def from_value_or_stdin(value: str, convert: Optional[Callable[[str], Any]] = None) -> Any:
@@ -111,7 +111,7 @@ def parse_numeric(s: str) -> int | float:
111111
return float(s)
112112

113113

114-
def build(args: argparse.Namespace) -> None:
114+
def build(args: argparse.Namespace) -> str:
115115
ulid: ULID
116116
if args.from_int is not None:
117117
ulid = ULID.from_int(from_value_or_stdin(args.from_int, int))
@@ -127,40 +127,38 @@ def build(args: argparse.Namespace) -> None:
127127
ulid = ULID.from_uuid(from_value_or_stdin(args.from_uuid, UUID))
128128
else:
129129
ulid = ULID()
130-
print(ulid)
130+
return str(ulid)
131131

132132

133-
def show(args: argparse.Namespace) -> None:
133+
def show(args: argparse.Namespace) -> str:
134134
ulid: ULID = ULID.from_str(from_value_or_stdin(args.ulid))
135135
if args.uuid:
136-
print(ulid.to_uuid())
136+
return str(ulid.to_uuid())
137137
elif args.uuid4:
138-
print(ulid.to_uuid4())
138+
return str(ulid.to_uuid4())
139139
elif args.hex:
140-
print(ulid.hex)
140+
return ulid.hex
141141
elif args.int:
142-
print(int(ulid))
142+
return str(int(ulid))
143143
elif args.timestamp:
144-
print(ulid.timestamp)
144+
return str(ulid.timestamp)
145145
elif args.datetime:
146-
print(ulid.datetime)
146+
return ulid.datetime.isoformat()
147147
else:
148-
print(
149-
textwrap.dedent(
150-
f"""
151-
ULID: {ulid!s}
152-
Hex: {ulid.hex}
153-
Int: {int(ulid)}
154-
Timestamp: {ulid.timestamp}
155-
Datetime: {ulid.datetime}
156-
"""
157-
).strip()
158-
)
148+
return textwrap.dedent(
149+
f"""
150+
ULID: {ulid!s}
151+
Hex: {ulid.hex}
152+
Int: {int(ulid)}
153+
Timestamp: {ulid.timestamp}
154+
Datetime: {ulid.datetime.isoformat()}
155+
"""
156+
).strip()
159157

160158

161-
def entrypoint() -> None:
162-
main(sys.argv[1:])
159+
def entrypoint() -> None: # pragma: no cover
160+
print(main(sys.argv[1:]))
163161

164162

165-
if __name__ == "__main__":
163+
if __name__ == "__main__": # pragma: no cover
166164
main(sys.argv[1:], "python -m ulid")

0 commit comments

Comments
 (0)