diff --git a/cypress/integration/rendering/erDiagram.spec.js b/cypress/integration/rendering/erDiagram.spec.js index 8f6193f96..6c89ea66d 100644 --- a/cypress/integration/rendering/erDiagram.spec.js +++ b/cypress/integration/rendering/erDiagram.spec.js @@ -369,4 +369,94 @@ ORDER ||--|{ LINE-ITEM : contains ); }); }); + + describe('Aggregation Relationships', () => { + it('should render basic aggregation relationships', () => { + imgSnapshotTest( + ` + erDiagram + DEPARTMENT <> EMPLOYEE : contains + PROJECT <>.. TASK : manages + TEAM <> MEMBER : consists_of + `, + { logLevel: 1 } + ); + }); + + it('should render aggregation with entity attributes', () => { + imgSnapshotTest( + ` + erDiagram + DEPARTMENT <> EMPLOYEE : contains + DEPARTMENT { + int id PK + string name + string location + } + EMPLOYEE { + int id PK + string name + int department_id FK + } + `, + { logLevel: 1 } + ); + }); + + it('should render aggregation with quoted labels', () => { + imgSnapshotTest( + ` + erDiagram + UNIVERSITY <> COLLEGE : "has multiple" + COLLEGE <> DEPARTMENT : "contains" + DEPARTMENT <> FACULTY : "employs" + `, + { logLevel: 1 } + ); + }); + + it('should render mixed relationship types', () => { + imgSnapshotTest( + ` + erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ ORDER_ITEM : contains + PRODUCT <> ORDER_ITEM : "aggregated in" + WAREHOUSE <>.. PRODUCT : "stores" + `, + { logLevel: 1 } + ); + }); + + it('should render aggregation with entity aliases', () => { + imgSnapshotTest( + ` + erDiagram + d[DEPARTMENT] + e[EMPLOYEE] + p[PROJECT] + t[TASK] + + d <> e : contains + p <>.. t : manages + + `, + { logLevel: 1 } + ); + }); + + it('should render complex aggregation scenarios', () => { + imgSnapshotTest( + ` + erDiagram + COMPANY <> DEPARTMENT : owns + DEPARTMENT <> EMPLOYEE : contains + EMPLOYEE <> PROJECT : works_on + PROJECT <> TASK : consists_of + TASK <> SUBTASK : includes + `, + { logLevel: 1 } + ); + }); + }); }); diff --git a/demos/er.html b/demos/er.html index b6c503c2e..74aae1b89 100644 --- a/demos/er.html +++ b/demos/er.html @@ -169,6 +169,164 @@
+ erDiagram + DEPARTMENT <> EMPLOYEE : contains + DEPARTMENT { + int id PK + string name + string location + } + EMPLOYEE { + int id PK + string name + int department_id FK + } ++
+ erDiagram + PROJECT <>.. TASK : manages + PROJECT { + int id PK + string name + string description + } + TASK { + int id PK + string title + int project_id FK + } ++
+ erDiagram + COMPANY <> DEPARTMENT : owns + DEPARTMENT <> EMPLOYEE : contains + EMPLOYEE <> PROJECT : works_on + PROJECT <> TASK : consists_of + + COMPANY { + int id PK + string name + } + DEPARTMENT { + int id PK + string name + int company_id FK + } + EMPLOYEE { + int id PK + string name + int department_id FK + } + PROJECT { + int id PK + string name + int employee_id FK + } + TASK { + int id PK + string title + int project_id FK + } ++
+ erDiagram + TEAM <> MEMBER : consists_of + TEAM { + int id PK + string name + } + MEMBER { + int id PK + string name + int team_id FK + } ++
+ erDiagram + UNIVERSITY <> COLLEGE : "has multiple" + COLLEGE <> DEPARTMENT : "contains" + DEPARTMENT <> FACULTY : "employs" + FACULTY <> STUDENT : "teaches" + + UNIVERSITY { + int id PK + string name + } + COLLEGE { + int id PK + string name + int university_id FK + } + DEPARTMENT { + int id PK + string name + int college_id FK + } + FACULTY { + int id PK + string name + int department_id FK + } + STUDENT { + int id PK + string name + int faculty_id FK + } ++
+ erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ ORDER_ITEM : contains + PRODUCT <> ORDER_ITEM : "aggregated in" + WAREHOUSE <>.. PRODUCT : "stores" + + CUSTOMER { + int id PK + string name + } + ORDER { + int id PK + int customer_id FK + date order_date + } + ORDER_ITEM { + int id PK + int order_id FK + int product_id FK + int quantity + } + PRODUCT { + int id PK + string name + int warehouse_id FK + } + WAREHOUSE { + int id PK + string name + } ++