Files
willtools-demo/WillTools.extension/tests/test_joblocate.py
T
will 52d94303bc
ci / test (push) Has been cancelled
WillTools: precast shop-ticket QC and panel handling tools
Public demo snapshot of an in-house pyRevit extension for precast concrete
shop-ticket QC (37 checks / 46 checklist rows) and a standalone panel
handling solver (PCI Chapter 8).

- No client, job, plant or product data: knowledge layers ship as
  structural templates only.
- Ticket QC's model-read escalation targets a LAN model server endpoint
  (configurable), not a cloud provider.
- Built from the private development repo via tools/make_dist.py.
2026-09-03 16:33:47 -05:00

155 lines
5.7 KiB
Python

# -*- coding: utf-8 -*-
"""Tests for `vibe.joblocate` -- picking a job's knowledge.yaml with no doc.
Loaded the ordinary way `conftest.py` makes possible (the module has no
Revit import at all, so a plain `from vibe import joblocate` just works).
Every env var is passed explicitly through `env={...}` rather than touched
on the real process environment, so these never depend on, or leak into,
whatever WILLTOOLS_JOBS happens to be set to on the machine running them.
"""
from vibe import joblocate as JL
def _mk_job(tmp_path, name, text=u'job:\n plant: x\n'):
folder = tmp_path / name
folder.mkdir()
(folder / 'knowledge.yaml').write_text(text, encoding='utf-8')
return folder
# ---------------------------------------------------------------- job_candidates
def test_job_candidates_finds_every_folder_with_a_knowledge_file(tmp_path):
_mk_job(tmp_path, 'alpha')
_mk_job(tmp_path, 'beta')
(tmp_path / 'not_a_job.txt').write_text('x', encoding='utf-8')
found = JL.job_candidates(str(tmp_path))
assert len(found) == 2
assert all(f.endswith('knowledge.yaml') for f in found)
def test_job_candidates_ignores_a_folder_with_no_knowledge_yaml(tmp_path):
(tmp_path / 'empty_job').mkdir()
assert JL.job_candidates(str(tmp_path)) == []
def test_job_candidates_ignores_files_at_the_top_level(tmp_path):
(tmp_path / 'knowledge.yaml').write_text('x', encoding='utf-8')
assert JL.job_candidates(str(tmp_path)) == []
def test_job_candidates_on_a_root_that_does_not_exist_is_empty(tmp_path):
assert JL.job_candidates(str(tmp_path / 'nope')) == []
def test_job_candidates_on_no_root_at_all_is_empty():
assert JL.job_candidates(None) == []
assert JL.job_candidates('') == []
# --------------------------------------------------------- resolve_job_knowledge
def test_explicit_wins_over_everything_else(tmp_path):
_mk_job(tmp_path, 'alpha')
_mk_job(tmp_path, 'beta')
result = JL.resolve_job_knowledge(explicit='some/file.yaml',
jobs_root=str(tmp_path))
assert result.path == 'some/file.yaml'
assert result.how == 'explicit'
assert bool(result) is True
def test_no_root_configured_is_not_blocking():
"""The ordinary state of a machine with no WILLTOOLS_JOBS at all -- a
caller may fall back to DEFAULTS without treating this as an error."""
result = JL.resolve_job_knowledge(jobs_root=None, env={})
assert result.path is None
assert result.blocking is False
assert 'WILLTOOLS_JOBS' in result.reason
def test_a_root_that_is_not_a_folder_is_blocking(tmp_path):
not_a_dir = tmp_path / 'not_a_dir.txt'
not_a_dir.write_text('x', encoding='utf-8')
result = JL.resolve_job_knowledge(jobs_root=str(not_a_dir))
assert result.path is None
assert result.blocking is True
assert str(not_a_dir) in result.reason
def test_a_single_job_folder_is_used_with_no_further_input(tmp_path):
job = _mk_job(tmp_path, 'sample_job')
result = JL.resolve_job_knowledge(jobs_root=str(tmp_path))
assert result.path == str(job / 'knowledge.yaml')
assert result.how == 'single'
assert result.blocking is False
def test_an_empty_jobs_root_is_not_blocking(tmp_path):
"""Nothing under it yet -- a fresh install, not a misconfiguration."""
result = JL.resolve_job_knowledge(jobs_root=str(tmp_path))
assert result.path is None
assert result.blocking is False
assert str(tmp_path) in result.reason
def test_several_job_folders_with_none_named_refuses_and_lists_them(tmp_path):
"""The exact ruling this module exists to enforce: guessing among several
real job folders is a worse failure than asking, so this is BLOCKING."""
_mk_job(tmp_path, 'sample_job')
_mk_job(tmp_path, 'Horizon')
_mk_job(tmp_path, 'sample_job_detached')
result = JL.resolve_job_knowledge(jobs_root=str(tmp_path))
assert result.path is None
assert result.blocking is True
assert result.reason is not None
assert 'sample_job' in result.reason
assert 'Horizon' in result.reason
assert 'sample_job_detached' in result.reason
assert len(result.candidates) == 3
assert '--job' in result.reason
def test_a_named_job_picks_one_of_several(tmp_path):
_mk_job(tmp_path, 'sample_job')
horizon = _mk_job(tmp_path, 'Horizon')
result = JL.resolve_job_knowledge(jobs_root=str(tmp_path),
job_name='Horizon')
assert result.path == str(horizon / 'knowledge.yaml')
assert result.how == 'named'
assert result.blocking is False
def test_a_named_job_that_does_not_exist_is_blocking_and_lists_real_ones(
tmp_path):
_mk_job(tmp_path, 'sample_job')
_mk_job(tmp_path, 'Horizon')
result = JL.resolve_job_knowledge(jobs_root=str(tmp_path),
job_name='NoSuchJob')
assert result.path is None
assert result.blocking is True
assert 'NoSuchJob' in result.reason
assert 'sample_job' in result.reason
assert 'Horizon' in result.reason
def test_env_supplies_the_root_when_jobs_root_is_not_given(tmp_path):
job = _mk_job(tmp_path, 'only-one')
result = JL.resolve_job_knowledge(env={JL.JOBS_ENV: str(tmp_path)})
assert result.path == str(job / 'knowledge.yaml')
def test_explicit_bypasses_env_entirely(tmp_path):
_mk_job(tmp_path, 'alpha')
_mk_job(tmp_path, 'beta')
result = JL.resolve_job_knowledge(explicit='chosen.yaml',
env={JL.JOBS_ENV: str(tmp_path)})
assert result.path == 'chosen.yaml'
assert result.how == 'explicit'
def test_result_is_falsy_when_nothing_was_found():
result = JL.resolve_job_knowledge(jobs_root=None, env={})
assert not result
assert bool(result) is False