ifcurl/tests/conftest.py
Bruno Postle 7f92cadc50 Authentication and test coverage
- ifcurl/auth.py: token config (~/.config/ifcurl/tokens.json),
  get_token_for_host(), inject_token() for HTTPS URL credential injection
- ifcurl/git.py: thread token= through fetch_ifc/fetch_ifc_bytes/_open_remote;
  authenticated fetch uses 'git fetch <auth_url> +refs/*:refs/*' so the
  token is never written to on-disk git config
- ifcurl/service.py: optional token field in PreviewRequest; request token
  takes precedence over config-file token; get_token_for_host imported at
  module level for clean monkeypatching in tests
- tests

Generated with the assistance of an AI coding tool.
2026-04-15 23:21:13 +01:00

98 lines
3.9 KiB
Python

"""Shared pytest fixtures for ifcurl tests."""
from __future__ import annotations
import ifcopenshell.api.aggregate
import ifcopenshell.api.context
import ifcopenshell.api.geometry
import ifcopenshell.api.owner.settings
import ifcopenshell.api.project
import ifcopenshell.api.root
import ifcopenshell.api.spatial
import ifcopenshell.api.unit
import numpy as np
import pytest
# ---------------------------------------------------------------------------
# IFC model fixtures
# ---------------------------------------------------------------------------
def _suppress_owner(f):
ifcopenshell.api.owner.settings.get_user = lambda ifc: (ifc.by_type("IfcPersonAndOrganization") or [None])[0]
ifcopenshell.api.owner.settings.get_application = lambda ifc: (ifc.by_type("IfcApplication") or [None])[0]
return f
@pytest.fixture(scope="session")
def model_with_geometry():
"""IFC4 model with two walls that have geometric representations."""
f = ifcopenshell.api.project.create_file()
_suppress_owner(f)
project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="TestProject")
ifcopenshell.api.unit.assign_unit(f)
site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="TestSite")
building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="TestBuilding")
storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Ground Floor")
ifcopenshell.api.aggregate.assign_object(f, products=[site], relating_object=project)
ifcopenshell.api.aggregate.assign_object(f, products=[building], relating_object=site)
ifcopenshell.api.aggregate.assign_object(f, products=[storey], relating_object=building)
model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model")
body = ifcopenshell.api.context.add_context(
f, context_type="Model", context_identifier="Body",
target_view="MODEL_VIEW", parent=model_ctx,
)
wall1 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall001")
rep1 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=5, height=3, thickness=0.2)
ifcopenshell.api.geometry.assign_representation(f, product=wall1, representation=rep1)
ifcopenshell.api.spatial.assign_container(f, products=[wall1], relating_structure=storey)
wall2 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name="Wall002")
rep2 = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=4, height=3, thickness=0.2)
ifcopenshell.api.geometry.assign_representation(f, product=wall2, representation=rep2)
ifcopenshell.api.spatial.assign_container(f, products=[wall2], relating_structure=storey)
matrix = np.eye(4)
matrix[1, 3] = 3.0
ifcopenshell.api.geometry.edit_object_placement(f, product=wall2, matrix=matrix)
return f
# ---------------------------------------------------------------------------
# Local git repo fixture
# ---------------------------------------------------------------------------
@pytest.fixture(scope="session")
def local_ifc_repo(tmp_path_factory, model_with_geometry):
"""A local bare-ish git repo containing model.ifc committed at HEAD.
Returns a dict with keys:
path — absolute path to the working-tree repo
hexsha — the commit hexsha
bytes — raw IFC file bytes as committed
"""
import git as gitpkg
repo_dir = tmp_path_factory.mktemp("ifc_repo")
ifc_path = repo_dir / "model.ifc"
model_with_geometry.write(str(ifc_path))
repo = gitpkg.Repo.init(str(repo_dir))
with repo.config_writer() as cw:
cw.set_value("user", "name", "Test")
cw.set_value("user", "email", "test@example.com")
repo.index.add(["model.ifc"])
commit = repo.index.commit("Add model")
repo.create_tag("v1.0")
return {
"path": str(repo_dir),
"hexsha": commit.hexsha,
"bytes": ifc_path.read_bytes(),
}