Files
IfcOpenShell/src/ifcopenshell-python/test/test_sql.py
T
Andrej730 1fa5eebf0c sql, stream: raise for accessing derived attributes
Raising `AttributeError` is definitely wasn't correct here, since it
might push the code to assume it's a wrong entity type. Returning some stub value like `None` also could suggest incorrect derived attribute
value, leading to unexpected behaviour. So adding an error, so it would
propagate and code would need to be adjusted not to rely on derived
attributes, if it actually interacts with sql/stream.

`test_unit` was asserting that derived attr will return `None`, though
it was actually raising `AttributeError`.
2026-09-02 20:08:33 +05:00

81 lines
2.7 KiB
Python

# IfcOpenShell - IFC toolkit and geometry engine
# Copyright (C) 2021 Thomas Krijnen <thomas@aecgeeks.com>
#
# This file is part of IfcOpenShell.
#
# IfcOpenShell is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# IfcOpenShell is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import tempfile
from pathlib import Path
import pytest
from ifcpatch.recipes import Ifc2Sql
import ifcopenshell
TEST_FILE = Path(__file__).parent / "files" / "basic.ifc"
SQLITE_PATH = None
def get_ifc_sqlite() -> ifcopenshell.sqlite:
global SQLITE_PATH
if SQLITE_PATH is None:
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".ifcsqlite")
ifc_file = ifcopenshell.open(TEST_FILE)
assert isinstance(ifc_file, ifcopenshell.file)
patcher = Ifc2Sql.Patcher(ifc_file, database=tmp.name)
patcher.patch()
SQLITE_PATH = tmp.name
ifc_sqlite = ifcopenshell.open(SQLITE_PATH)
assert isinstance(ifc_sqlite, ifcopenshell.sqlite)
return ifc_sqlite
class TestFile:
def test_run(self):
ifc_sqlite = get_ifc_sqlite()
assert ifc_sqlite.schema == "IFC4"
def test_by_id(self):
ifc_sqlite = get_ifc_sqlite()
assert (element := ifc_sqlite.by_id(1))
assert str(element) == "#1=IFCPROJECT('3kv235yMjDO9tHiTzD8QuS',$,'My Project',$,$,$,$,(#14,#26),#9);"
def test_by_type(self):
ifc_sqlite = get_ifc_sqlite()
assert (elements := ifc_sqlite.by_type("IfcProject"))
assert str(elements[0]) == "#1=IFCPROJECT('3kv235yMjDO9tHiTzD8QuS',$,'My Project',$,$,$,$,(#14,#26),#9);"
class TestEntity:
def test_getattr(self):
ifc_sqlite = get_ifc_sqlite()
assert (element := ifc_sqlite.by_id(1))
assert element.Name == "My Project"
def test_getattr_derive(self):
ifc_sqlite = get_ifc_sqlite()
assert (units := ifc_sqlite.by_type("IfcSIUnit"))
with pytest.raises(RuntimeError):
units[0].Dimensions
def test_setattr(self):
ifc_sqlite = get_ifc_sqlite()
assert (element := ifc_sqlite.by_id(1))
assert element.Name == "My Project"
element.Name = "Foo"
assert element.Name == "Foo"
element.Name = "My Project"
assert element.Name == "My Project"