From 57180e3596208e72b78c5490f2d03b406bce11a7 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Thu, 25 Jun 2026 15:11:22 +0200 Subject: [PATCH] jw.pkg.lib.Uri: Add unit test The Uri class provides URL parsing and manipulation utilities used throughout jw-pkg. Add a unit test covering URL parsing, credential handling, path manipulation, and safe string formatting. Signed-off-by: Jan Lindemann --- test/Makefile | 2 + test/unit/Makefile | 4 ++ test/unit/python/Makefile | 4 ++ test/unit/python/lib/Makefile | 4 ++ test/unit/python/lib/Uri/Makefile | 7 +++ test/unit/python/lib/Uri/test.py | 88 +++++++++++++++++++++++++++++++ 6 files changed, 109 insertions(+) create mode 100644 test/unit/Makefile create mode 100644 test/unit/python/Makefile create mode 100644 test/unit/python/lib/Makefile create mode 100644 test/unit/python/lib/Uri/Makefile create mode 100644 test/unit/python/lib/Uri/test.py diff --git a/test/Makefile b/test/Makefile index a9018b59..959f094f 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,4 +1,6 @@ TOPDIR = .. +ORDERED_SUBDIRS = unit integration + include $(TOPDIR)/make/proj.mk include $(JWBDIR)/make/dirs.mk diff --git a/test/unit/Makefile b/test/unit/Makefile new file mode 100644 index 00000000..b1ec41b6 --- /dev/null +++ b/test/unit/Makefile @@ -0,0 +1,4 @@ +TOPDIR = ../.. + +include $(TOPDIR)/make/proj.mk +include $(JWBDIR)/make/dirs.mk diff --git a/test/unit/python/Makefile b/test/unit/python/Makefile new file mode 100644 index 00000000..62d684a7 --- /dev/null +++ b/test/unit/python/Makefile @@ -0,0 +1,4 @@ +TOPDIR = ../../.. + +include $(TOPDIR)/make/proj.mk +include $(JWBDIR)/make/dirs.mk diff --git a/test/unit/python/lib/Makefile b/test/unit/python/lib/Makefile new file mode 100644 index 00000000..5e331b8e --- /dev/null +++ b/test/unit/python/lib/Makefile @@ -0,0 +1,4 @@ +TOPDIR = ../../../.. + +include $(TOPDIR)/make/proj.mk +include $(JWBDIR)/make/dirs.mk diff --git a/test/unit/python/lib/Uri/Makefile b/test/unit/python/lib/Uri/Makefile new file mode 100644 index 00000000..a2efda8e --- /dev/null +++ b/test/unit/python/lib/Uri/Makefile @@ -0,0 +1,7 @@ +TOPDIR = ../../../../../ + +include $(TOPDIR)/make/proj.mk +include $(JWBDIR)/make/py-run.mk + +all: +test: run diff --git a/test/unit/python/lib/Uri/test.py b/test/unit/python/lib/Uri/test.py new file mode 100644 index 00000000..109e4b24 --- /dev/null +++ b/test/unit/python/lib/Uri/test.py @@ -0,0 +1,88 @@ +import sys, os + +# Mirror the source tree structure so imports resolve correctly +src_root = os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'src', 'python') +sys.path.insert(0, src_root) + +from jw.pkg.lib.Uri import Uri + +# Basic URL parsing +u = Uri('ssh://john.doe@host:22/path/to/repo') +assert u.protocol == 'ssh' +assert u.hostname == 'host' +assert u.port == 22 +assert u.path == '/path/to/repo' + +# Username and password +u = Uri('https://user:pass@example.com/repo') +assert u.username == 'user' +assert u.password == 'pass' + +# Credentials in output +u = Uri('https://user:secret@example.com/repo') +assert 'secret' in u.full # full shows password +assert '' in u.safe_full_with_username # safe version hides password + +# Scheme defaults to file +u = Uri('/local/path') +assert u.scheme == 'file://' +assert u.protocol == 'file' + +# Pimp returns existing Uri unchanged +u1 = Uri('ssh://host/path') +u2 = Uri.pimp(u1) +assert u2 is u1 + +# New with path (add) +u = Uri('ssh://host/path') +u2 = u.new_add_path('subdir') +assert u2.to_string == 'ssh://host/path/subdir' + +# New with path (replace) - to_string is updated +u3 = u.new_replace_path('/other') +assert u3.to_string == 'ssh://host/other' + +# Authority includes credentials +u = Uri('ssh://user:pass@host:22/path') +assert u.authority == 'userpass@host:22' + +# Origin excludes credentials +assert u.origin == 'host:22' + +# ID and safe version hide password +assert u.id == 'ssh://user:@host:22' +assert '' in u.safe_full_with_username + +# Full includes path and credentials +assert u.full == 'ssh://userpass@host:22/path' + +# Simple URLs +u = Uri('https://example.com/repo.git') +assert u.hostname == 'example.com' +assert u.path == '/repo.git' +assert u.basename == 'repo.git' + +# Username setter +u = Uri('ssh://host/path') +u.set_username('newuser') +assert u.username == 'newuser' + +# Password setter +u = Uri('ssh://host/path') +u.set_password('newpass') +assert u.password == 'newpass' + +# No port +u = Uri('ssh://host/path') +assert u.port is None +assert u.port_str is None + +# to_string returns original +u = Uri('ssh://user:pass@host:22/path') +assert u.to_string == 'ssh://user:pass@host:22/path' + +# String representation hides credentials +u = Uri('https://user:secret@example.com/repo.git') +assert '' in str(u) + +print('All Uri tests passed')