Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ jobs:
MEDIA_ROOT: /tmp/files_storage
CELERY_BROKER_URL: redis://redis:6379/0
CELERY_RESULT_BACKEND: django-db
CELERY_TASK_ALWAYS_EAGER: "false"
CELERY_TASK_EAGER_PROPAGATES: "false"
CELERY_TASK_ALWAYS_EAGER: "true"
CELERY_TASK_EAGER_PROPAGATES: "true"
DJANGO_ALLOWED_HOSTS: "localhost 127.0.0.1"
DJANGO_TRUSTED_ORIGINS: "http://localhost:3000 http://127.0.0.1:3000 http://localhost:8000 http://127.0.0.1:8000"
POSTGRES_USER: postgres
Expand Down Expand Up @@ -169,7 +169,7 @@ jobs:
VIRTUAL_ENV: backend/.dev/venv

- name: Run Playwright tests
run: npx playwright test --workers="$(node -p "Math.max(1, Math.min(Math.floor((require('os').cpus()?.length||2)*0.75), 8))")"
run: npx playwright test
working-directory: ./e2e
env:
DJANGO_DB: postgresql
Expand Down
4 changes: 2 additions & 2 deletions backend/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ install: venv
install-macos: venv
find . -name 'requirements.txt' -exec $(PIP) install -r {} \;
$(PIP) install -r requirements.txt
wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.5-1c5b825-macos64.zip"
wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.5-a51b2c5-macos64.zip"
mkdir -p $(VIRTUAL_ENV)/lib/python3.11/site-packages
unzip /tmp/ifcopenshell_python.zip -d $(VIRTUAL_ENV)/lib/python3.11/site-packages
rm /tmp/ifcopenshell_python.zip

install-macos-m1: venv
find . -name 'requirements.txt' -exec $(PIP) install -r {} \;
$(PIP) install -r requirements.txt
wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.5-1c5b825-macosm164.zip"
wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.5-a51b2c5-macosm164.zip"
mkdir -p $(VIRTUAL_ENV)/lib/python3.11/site-packages
unzip /tmp/ifcopenshell_python.zip -d $(VIRTUAL_ENV)/lib/python3.11/site-packages
rm /tmp/ifcopenshell_python.zip
Expand Down
57 changes: 57 additions & 0 deletions e2e/fixtures/allowlisting/allowlisted_proxyqto.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2026-02-24T09:56:49',(''),(''),'IfcOpenShell 0.8.0','IfcOpenShell 0.8.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,'User','Generated',$,$,$,$,$);
#2=IFCORGANIZATION($,'Example Org',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'1.0','IfcOpenShell','ifcopenshell');
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,$,$,1771923409);
#6=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#7=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#8=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#9=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#10=IFCUNITASSIGNMENT((#6,#7,#8,#9));
#11=IFCCARTESIANPOINT((0.,0.,0.));
#12=IFCDIRECTION((0.,0.,1.));
#13=IFCDIRECTION((1.,0.,0.));
#14=IFCAXIS2PLACEMENT3D(#11,#12,#13);
#15=IFCGEOMETRICREPRESENTATIONCONTEXT('Model','Model',3,1.E-05,#14,$);
#16=IFCPROJECT('1BMjysx0n9MvGMpzkFND_A',#5,'Example Project',$,$,$,$,(#15),#10);
#17=IFCCARTESIANPOINT((0.,0.,0.));
#18=IFCDIRECTION((0.,0.,1.));
#19=IFCDIRECTION((1.,0.,0.));
#20=IFCAXIS2PLACEMENT3D(#17,#18,#19);
#21=IFCLOCALPLACEMENT($,#20);
#22=IFCSITE('1Fkx8DCKTFwvnU9ad7fr64',#5,'Site',$,$,#21,$,$,.ELEMENT.,$,$,$,$,$);
#23=IFCCARTESIANPOINT((0.,0.,0.));
#24=IFCDIRECTION((0.,0.,1.));
#25=IFCDIRECTION((1.,0.,0.));
#26=IFCAXIS2PLACEMENT3D(#23,#24,#25);
#27=IFCLOCALPLACEMENT(#21,#26);
#28=IFCBUILDING('3MvFJc7E1C_PJg__ZCQSxq',#5,'Building',$,$,#27,$,$,.ELEMENT.,$,$,$);
#29=IFCCARTESIANPOINT((0.,0.,0.));
#30=IFCDIRECTION((0.,0.,1.));
#31=IFCDIRECTION((1.,0.,0.));
#32=IFCAXIS2PLACEMENT3D(#29,#30,#31);
#33=IFCLOCALPLACEMENT(#27,#32);
#34=IFCBUILDINGSTOREY('283AuHtNn9XA4199h9ReZ0',#5,'Level 0',$,$,#33,$,$,.ELEMENT.,0.);
#35=IFCRELAGGREGATES('36lNwFyi5BIfxze4QqIrl3',#5,$,$,#16,(#22));
#36=IFCRELAGGREGATES('25bFosZlv5R8R32MNvf9$Y',#5,$,$,#22,(#28));
#37=IFCRELAGGREGATES('3Mf03PrbD6CfEDjAk6NWrg',#5,$,$,#28,(#34));
#38=IFCCARTESIANPOINT((0.,0.,0.));
#39=IFCDIRECTION((0.,0.,1.));
#40=IFCDIRECTION((1.,0.,0.));
#41=IFCAXIS2PLACEMENT3D(#38,#39,#40);
#42=IFCLOCALPLACEMENT(#33,#41);
#43=IFCBUILDINGELEMENTPROXY('3FQgpTOKHC6PgbGLrO7C3X',#5,'Proxy 01',$,$,#42,$,$,.NOTDEFINED.);
#44=IFCRELCONTAINEDINSPATIALSTRUCTURE('0jsrh1zyP8hRK5zq7BW7Jz',#5,$,$,(#43),#34);
#45=IFCQUANTITYAREA('NetSurfaceArea',$,$,12.34,$);
#46=IFCQUANTITYVOLUME('NetVolume',$,$,56.78,$);
#47=IFCELEMENTQUANTITY('2ETxYtAXDDVBdYAZjPNhxl',$,'Qto_BuildingElementProxyQuantities',$,'BaseQuantities',(#45,#46));
#48=IFCRELDEFINESBYPROPERTIES('1RiLQ$p2jD2BR9e6LxFE2r',#5,$,$,(#43),#47);
ENDSEC;
END-ISO-10303-21;
49 changes: 49 additions & 0 deletions e2e/fixtures/allowlisting/allowlisted_storeyqto.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2026-02-24T09:56:49',(''),(''),'IfcOpenShell 0.8.0','IfcOpenShell 0.8.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,'User','Generated',$,$,$,$,$);
#2=IFCORGANIZATION($,'Example Org',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'1.0','IfcOpenShell','ifcopenshell');
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,$,$,1771923409);
#6=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#7=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#8=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#9=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#10=IFCUNITASSIGNMENT((#6,#7,#8,#9));
#11=IFCCARTESIANPOINT((0.,0.,0.));
#12=IFCDIRECTION((0.,0.,1.));
#13=IFCDIRECTION((1.,0.,0.));
#14=IFCAXIS2PLACEMENT3D(#11,#12,#13);
#15=IFCGEOMETRICREPRESENTATIONCONTEXT('Model','Model',3,1.E-05,#14,$);
#16=IFCPROJECT('1iyfGnLr1A5QObe35JynRA',#5,'Example Project',$,$,$,$,(#15),#10);
#17=IFCCARTESIANPOINT((0.,0.,0.));
#18=IFCDIRECTION((0.,0.,1.));
#19=IFCDIRECTION((1.,0.,0.));
#20=IFCAXIS2PLACEMENT3D(#17,#18,#19);
#21=IFCLOCALPLACEMENT($,#20);
#22=IFCSITE('0xq5s0Sef4eBW2L6xclQoY',#5,'Site',$,$,#21,$,$,.ELEMENT.,$,$,$,$,$);
#23=IFCCARTESIANPOINT((0.,0.,0.));
#24=IFCDIRECTION((0.,0.,1.));
#25=IFCDIRECTION((1.,0.,0.));
#26=IFCAXIS2PLACEMENT3D(#23,#24,#25);
#27=IFCLOCALPLACEMENT(#21,#26);
#28=IFCBUILDING('19vP5ojgzA4Ak8tpTDmsFk',#5,'Building',$,$,#27,$,$,.ELEMENT.,$,$,$);
#29=IFCCARTESIANPOINT((0.,0.,0.));
#30=IFCDIRECTION((0.,0.,1.));
#31=IFCDIRECTION((1.,0.,0.));
#32=IFCAXIS2PLACEMENT3D(#29,#30,#31);
#33=IFCLOCALPLACEMENT(#27,#32);
#34=IFCBUILDINGSTOREY('0udBjQTrz6qesrXheLTe9j',#5,'Level 0',$,$,#33,$,$,.ELEMENT.,0.);
#35=IFCRELAGGREGATES('168q3RcXXBpw6F0BU2RPbH',#5,$,$,#16,(#22));
#36=IFCRELAGGREGATES('0nFUVKgJ11avoRp_pS0krY',#5,$,$,#22,(#28));
#37=IFCRELAGGREGATES('3XdgFhFOPFaf0jfpU9_z85',#5,$,$,#28,(#34));
#38=IFCQUANTITYLENGTH('NetHeight',$,$,12.34,$);
#39=IFCELEMENTQUANTITY('3KXvj87n5EZR22_nDKi31k',$,'Qto_BuildingStoreyBaseQuantities',$,'BaseQuantities',(#38));
#40=IFCRELDEFINESBYPROPERTIES('1ihyW38pfDy8xBvjsE5Dq8',#5,$,$,(#34),#39);
ENDSEC;
END-ISO-10303-21;
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]'),'2;1');
FILE_NAME('','2026-01-30T19:23:32',(''),(''),'IfcOpenShell contributors - IfcOpenShell - v0.8.0','IfcOpenShell contributors - IfcOpenShell - v0.8.0','');
FILE_NAME('','2026-01-30T19:23:32',(''),(''),'Test3 - Test3 - v3.0','Test3 - Test3 - v3.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.8.0','IfcOpenShell contributors - IfcOpenShell - v0.8.0','');
#4=IFCAPPLICATION(#2,'0.8.0','Test3 - Test3 - v3.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1769801012);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
Expand All @@ -28,5 +28,9 @@ DATA;
#21=IFCTRANSFORMER('152EkAn$n33hZ6u_M0ABgY',$,$,$,$,$,$,$,$);
#22=IFCTRANSFORMERTYPE('1_GJgCelfA8uThkk8mMvX9',$,'T',$,$,$,$,$,$,.CURRENT.);
#23=IFCRELDEFINESBYTYPE('0_sGsYHQLAMgWs1UcXRuBz',$,$,$,(#21),#22);
#25=IFCRELAGGREGATES('1_FiI$EtrAVumQxKPOEZu6',#5,$,$,#20,(#41));
#41=IFCSITE('060XCG67v9ZO7i9CQZAKvK',#5,$,$,$,$,$,$,.ELEMENT.,$,$,0.,$,$);
#24=IFCRELCONTAINEDINSPATIALSTRUCTURE('0mSqFiWyj4IPh$N3UgmOC9',#5,$,$,(#21),#41);
#103= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#11,$,.MODEL_VIEW.,$);
ENDSEC;
END-ISO-10303-21;
49 changes: 49 additions & 0 deletions e2e/fixtures/allowlisting/not_allowlisted_storeyqto.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2026-02-24T09:56:49',(''),(''),'IfcOpenShell 0.8.0','IfcOpenShell 0.8.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,'User','Generated',$,$,$,$,$);
#2=IFCORGANIZATION($,'Example Org',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'1.0','IfcOpenShell','ifcopenshell');
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,$,$,1771923409);
#6=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#7=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#8=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#9=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#10=IFCUNITASSIGNMENT((#6,#7,#8,#9));
#11=IFCCARTESIANPOINT((0.,0.,0.));
#12=IFCDIRECTION((0.,0.,1.));
#13=IFCDIRECTION((1.,0.,0.));
#14=IFCAXIS2PLACEMENT3D(#11,#12,#13);
#15=IFCGEOMETRICREPRESENTATIONCONTEXT('Model','Model',3,1.E-05,#14,$);
#16=IFCPROJECT('1iyfGnLr1A5QObe35JynRA',#5,'Example Project',$,$,$,$,(#15),#10);
#17=IFCCARTESIANPOINT((0.,0.,0.));
#18=IFCDIRECTION((0.,0.,1.));
#19=IFCDIRECTION((1.,0.,0.));
#20=IFCAXIS2PLACEMENT3D(#17,#18,#19);
#21=IFCLOCALPLACEMENT($,#20);
#22=IFCSITE('0xq5s0Sef4eBW2L6xclQoY',#5,'Site',$,$,#21,$,$,.ELEMENT.,$,$,$,$,$);
#23=IFCCARTESIANPOINT((0.,0.,0.));
#24=IFCDIRECTION((0.,0.,1.));
#25=IFCDIRECTION((1.,0.,0.));
#26=IFCAXIS2PLACEMENT3D(#23,#24,#25);
#27=IFCLOCALPLACEMENT(#21,#26);
#28=IFCBUILDING('19vP5ojgzA4Ak8tpTDmsFk',#5,'Building',$,$,#27,$,$,.ELEMENT.,$,$,$);
#29=IFCCARTESIANPOINT((0.,0.,0.));
#30=IFCDIRECTION((0.,0.,1.));
#31=IFCDIRECTION((1.,0.,0.));
#32=IFCAXIS2PLACEMENT3D(#29,#30,#31);
#33=IFCLOCALPLACEMENT(#27,#32);
#34=IFCBUILDINGSTOREY('0udBjQTrz6qesrXheLTe9j',#5,'Level 0',$,$,#33,$,$,.ELEMENT.,0.);
#35=IFCRELAGGREGATES('168q3RcXXBpw6F0BU2RPbH',#5,$,$,#16,(#22));
#36=IFCRELAGGREGATES('0nFUVKgJ11avoRp_pS0krY',#5,$,$,#22,(#28));
#37=IFCRELAGGREGATES('3XdgFhFOPFaf0jfpU9_z85',#5,$,$,#28,(#34));
#38=IFCQUANTITYLENGTH('NtHeight',$,$,12.34,$);
#39=IFCELEMENTQUANTITY('3KXvj87n5EZR22_nDKi31k',$,'Qto_BuildingStoreyBaseQuantities',$,'BaseQuantities',(#38));
#40=IFCRELDEFINESBYPROPERTIES('1ihyW38pfDy8xBvjsE5Dq8',#5,$,$,(#34),#39);
ENDSEC;
END-ISO-10303-21;
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,9 @@ DATA;
#21=IFCTRANSFORMER('152EkAn$n33hZ6u_M0ABgY',$,$,$,$,$,$,$,$);
#23=IFCRELDEFINESBYTYPE('0_sGsYHQLAMgWs1UcXRuBz',$,$,$,(#21),#24);
#24=IFCWALLTYPE('2so5A4Lx95i9ZO0y$h3Upk',$,'T',$,$,$,$,$,$,.MOVABLE.);
#25=IFCRELAGGREGATES('1_FiI$EtrAVumQxKPOEZu6',#5,$,$,#20,(#41));
#41=IFCSITE('060XCG67v9ZO7i9CQZAKvK',#5,$,$,$,$,$,$,.ELEMENT.,$,$,0.,$,$);
#26=IFCRELCONTAINEDINSPATIALSTRUCTURE('0mSqFiWyj4IPh$N3UgmOC9',#5,$,$,(#21),#41);
#103= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#11,$,.MODEL_VIEW.,$);
ENDSEC;
END-ISO-10303-21;
9 changes: 7 additions & 2 deletions e2e/playwright.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ export default defineConfig({
projects: [
{
name: 'e2e-tests',
testMatch: '**/tests/*.test.js',
testMatch: [
'**/tests/django_admin.test.js',
'**/tests/validate.test.js',
'**/tests/validate_api.test.js',
'**/tests/allowlisting.test.js',
],
use: {
...devices['Desktop Chrome'],
// API tests don't need a browser, but we'll use request context
Expand Down Expand Up @@ -73,7 +78,7 @@ export default defineConfig({
/* Test timeout */
timeout: 60 * 1000,
expect: {
timeout: 15 * 1000,
timeout: 30 * 1000,
},

/* Output directory for test results */
Expand Down
Loading
Loading