mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-10-26 08:24:07 +01:00
Update tests
This commit is contained in:
638
cypress/integration/rendering/erDiagram-unified.spec.js
Normal file
638
cypress/integration/rendering/erDiagram-unified.spec.js
Normal file
@@ -0,0 +1,638 @@
|
|||||||
|
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
const testOptions = [
|
||||||
|
{ description: '', options: { logLevel: 1 } },
|
||||||
|
{ description: 'ELK: ', options: { logLevel: 1, layout: 'elk' } },
|
||||||
|
{ description: 'HD: ', options: { logLevel: 1, look: 'handDrawn' } },
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('Entity Relationship Diagram Unified', () => {
|
||||||
|
testOptions.forEach(({ description, options }) => {
|
||||||
|
it(`${description}should render a simple ER diagram`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ LINE-ITEM : contains
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render a simple ER diagram without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ LINE-ITEM : contains
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with a recursive relationship`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||..o{ CUSTOMER : refers
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ LINE-ITEM : contains
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with multiple relationships between the same two entities`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||--|{ ADDRESS : "invoiced at"
|
||||||
|
CUSTOMER ||--|{ ADDRESS : "receives goods at"
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render a cyclical ER diagram`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
A ||--|{ B : likes
|
||||||
|
B ||--|{ C : likes
|
||||||
|
C ||--|{ A : likes
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render a not-so-simple ER diagram`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
CUSTOMER ||--o{ INVOICE : "liable for"
|
||||||
|
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
||||||
|
INVOICE ||--|{ ORDER : covers
|
||||||
|
ORDER ||--|{ ORDER-ITEM : includes
|
||||||
|
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
||||||
|
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render a not-so-simple ER diagram without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
CUSTOMER ||--o{ INVOICE : "liable for"
|
||||||
|
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
||||||
|
INVOICE ||--|{ ORDER : covers
|
||||||
|
ORDER ||--|{ ORDER-ITEM : includes
|
||||||
|
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
||||||
|
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render multiple ER diagrams`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
[
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ LINE-ITEM : contains
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ LINE-ITEM : contains
|
||||||
|
`,
|
||||||
|
],
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with blank or empty labels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
BOOK }|..|{ AUTHOR : ""
|
||||||
|
BOOK }|..|{ GENRE : " "
|
||||||
|
AUTHOR }|..|{ GENRE : " "
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities that have no relationships`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
DEAD_PARROT
|
||||||
|
HERMIT
|
||||||
|
RECLUSE
|
||||||
|
SOCIALITE }o--o{ SOCIALITE : "interacts with"
|
||||||
|
RECLUSE }o--o{ SOCIALITE : avoids
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with and without attributes`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
BOOK { string title }
|
||||||
|
AUTHOR }|..|{ BOOK : writes
|
||||||
|
BOOK { float price }
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with generic and array attributes`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
BOOK {
|
||||||
|
string title
|
||||||
|
string[] authors
|
||||||
|
type~T~ type
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with generic and array attributes without htmlLabels`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
BOOK {
|
||||||
|
string title
|
||||||
|
string[] authors
|
||||||
|
type~T~ type
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with length in attributes type`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CLUSTER {
|
||||||
|
varchar(99) name
|
||||||
|
string(255) description
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with length in attributes type without htmlLabels`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CLUSTER {
|
||||||
|
varchar(99) name
|
||||||
|
string(255) description
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities and attributes with big and small entity names`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
PRIVATE_FINANCIAL_INSTITUTION {
|
||||||
|
string name
|
||||||
|
int turnover
|
||||||
|
}
|
||||||
|
PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs
|
||||||
|
EMPLOYEE { bool officer_of_firm }
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities and attributes with big and small entity names without htmlLabels`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
PRIVATE_FINANCIAL_INSTITUTION {
|
||||||
|
string name
|
||||||
|
int turnover
|
||||||
|
}
|
||||||
|
PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs
|
||||||
|
EMPLOYEE { bool officer_of_firm }
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with attributes that begin with asterisk`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
BOOK {
|
||||||
|
int *id
|
||||||
|
string name
|
||||||
|
varchar(99) summary
|
||||||
|
}
|
||||||
|
BOOK }o..o{ STORE : soldBy
|
||||||
|
STORE {
|
||||||
|
int *id
|
||||||
|
string name
|
||||||
|
varchar(50) address
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with attributes that begin with asterisk without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
BOOK {
|
||||||
|
int *id
|
||||||
|
string name
|
||||||
|
varchar(99) summary
|
||||||
|
}
|
||||||
|
BOOK }o..o{ STORE : soldBy
|
||||||
|
STORE {
|
||||||
|
int *id
|
||||||
|
string name
|
||||||
|
varchar(50) address
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with keys`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||||
|
string name PK
|
||||||
|
}
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||||
|
BOOK {
|
||||||
|
float price
|
||||||
|
string author FK
|
||||||
|
string title PK
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with keys without htmlLabels`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||||
|
string name PK
|
||||||
|
}
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||||
|
BOOK {
|
||||||
|
float price
|
||||||
|
string author FK
|
||||||
|
string title PK
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with comments`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||||
|
string name "comment"
|
||||||
|
}
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||||
|
BOOK {
|
||||||
|
string author
|
||||||
|
string title "author comment"
|
||||||
|
float price "price comment"
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with comments without htmlLabels`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||||
|
string name "comment"
|
||||||
|
}
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||||
|
BOOK {
|
||||||
|
string author
|
||||||
|
string title "author comment"
|
||||||
|
float price "price comment"
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with keys and comments`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||||
|
string name PK "comment"
|
||||||
|
}
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||||
|
BOOK {
|
||||||
|
string description
|
||||||
|
float price "price comment"
|
||||||
|
string title PK "title comment"
|
||||||
|
string author FK
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with keys and comments without htmlLabels`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME {
|
||||||
|
string name PK "comment"
|
||||||
|
}
|
||||||
|
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
||||||
|
BOOK {
|
||||||
|
string description
|
||||||
|
float price "price comment"
|
||||||
|
string title PK "title comment"
|
||||||
|
string author FK
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with aliases`, () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
T1 one or zero to one or more T2 : test
|
||||||
|
T2 one or many optionally to zero or one T3 : test
|
||||||
|
T3 zero or more to zero or many T4 : test
|
||||||
|
T4 many(0) to many(1) T5 : test
|
||||||
|
T5 many optionally to one T6 : test
|
||||||
|
T6 only one optionally to only one T1 : test
|
||||||
|
T4 0+ to 1+ T6 : test
|
||||||
|
T1 1 to 1 T3 : test
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render a simple ER diagram with a title`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
title: simple ER diagram
|
||||||
|
---
|
||||||
|
erDiagram
|
||||||
|
CUSTOMER ||--o{ ORDER : places
|
||||||
|
ORDER ||--|{ LINE-ITEM : contains
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with entity name aliases`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
p[Person] {
|
||||||
|
varchar(64) firstName
|
||||||
|
varchar(64) lastName
|
||||||
|
}
|
||||||
|
c["Customer Account"] {
|
||||||
|
varchar(128) email
|
||||||
|
}
|
||||||
|
p ||--o| c : has
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render relationship labels with line breaks`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
p[Person] {
|
||||||
|
string firstName
|
||||||
|
string lastName
|
||||||
|
}
|
||||||
|
a["Customer Account"] {
|
||||||
|
string email
|
||||||
|
}
|
||||||
|
|
||||||
|
b["Customer Account Secondary"] {
|
||||||
|
string email
|
||||||
|
}
|
||||||
|
|
||||||
|
c["Customer Account Tertiary"] {
|
||||||
|
string email
|
||||||
|
}
|
||||||
|
|
||||||
|
d["Customer Account Nth"] {
|
||||||
|
string email
|
||||||
|
}
|
||||||
|
|
||||||
|
p ||--o| a : "has<br />one"
|
||||||
|
p ||--o| b : "has<br />one<br />two"
|
||||||
|
p ||--o| c : "has<br />one<br/>two<br />three"
|
||||||
|
p ||--o| d : "has<br />one<br />two<br/>three<br />...<br/>Nth"
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with unicode text`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
_**testẽζ➕Ø😀㌕ぼ**_ {
|
||||||
|
*__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***"
|
||||||
|
*string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs"
|
||||||
|
string last*Name*
|
||||||
|
string __phone__ UK
|
||||||
|
int _age_
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with unicode text without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
_**testẽζ➕Ø😀㌕ぼ**_ {
|
||||||
|
*__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***"
|
||||||
|
*string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs"
|
||||||
|
string last*Name*
|
||||||
|
string __phone__ UK
|
||||||
|
int _age_
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with relationships with unicode text`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
person[😀] {
|
||||||
|
string *first*Name
|
||||||
|
string _**last**Name_
|
||||||
|
}
|
||||||
|
a["*Customer Account*"] {
|
||||||
|
**string** ema*i*l
|
||||||
|
}
|
||||||
|
person ||--o| a : __hẽ😀__
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with relationships with unicode text without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
person[😀] {
|
||||||
|
string *first*Name
|
||||||
|
string _**last**Name_
|
||||||
|
}
|
||||||
|
a["*Customer Account*"] {
|
||||||
|
**string** ema*i*l
|
||||||
|
}
|
||||||
|
person ||--o| a : __hẽ😀__
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with TB direction`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
direction TB
|
||||||
|
CAR ||--|{ NAMED-DRIVER : allows
|
||||||
|
PERSON ||..o{ NAMED-DRIVER : is
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with BT direction`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
direction BT
|
||||||
|
CAR ||--|{ NAMED-DRIVER : allows
|
||||||
|
PERSON ||..o{ NAMED-DRIVER : is
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with LR direction`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
direction LR
|
||||||
|
CAR ||--|{ NAMED-DRIVER : allows
|
||||||
|
PERSON ||..o{ NAMED-DRIVER : is
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render an ER diagram with RL direction`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
direction RL
|
||||||
|
CAR ||--|{ NAMED-DRIVER : allows
|
||||||
|
PERSON ||..o{ NAMED-DRIVER : is
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with styles applied from style statement`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
c[CUSTOMER]
|
||||||
|
p[PERSON]
|
||||||
|
style c,p fill:#f9f,stroke:blue, color:grey, font-size:24px,font-weight:bold
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with styles applied from style statement without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
c[CUSTOMER]
|
||||||
|
p[PERSON]
|
||||||
|
style c,p fill:#f9f,stroke:blue, color:grey, font-size:24px,font-weight:bold
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with styles applied from class statement`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
c[CUSTOMER]
|
||||||
|
p[PERSON]:::blue
|
||||||
|
classDef bold font-size:24px, font-weight: bold
|
||||||
|
classDef blue stroke:lightblue, color: #0000FF
|
||||||
|
class c,p bold
|
||||||
|
`,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`${description}should render entities with styles applied from class statement without htmlLabels`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
c[CUSTOMER]
|
||||||
|
p[PERSON]:::blue
|
||||||
|
classDef bold font-size:24px, font-weight: bold
|
||||||
|
classDef blue stroke:lightblue, color: #0000FF
|
||||||
|
class c,p bold
|
||||||
|
`,
|
||||||
|
{ ...options, htmlLabels: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,697 +0,0 @@
|
|||||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
|
||||||
|
|
||||||
describe('Entity Relationship Diagram', () => {
|
|
||||||
it('should render a simple ER diagram', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
ORDER ||--|{ LINE-ITEM : contains
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render a simple ER diagram without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
ORDER ||--|{ LINE-ITEM : contains
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with a recursive relationship', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||..o{ CUSTOMER : refers
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
ORDER ||--|{ LINE-ITEM : contains
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with multiple relationships between the same two entities', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||--|{ ADDRESS : "invoiced at"
|
|
||||||
CUSTOMER ||--|{ ADDRESS : "receives goods at"
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render a cyclical ER diagram', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
A ||--|{ B : likes
|
|
||||||
B ||--|{ C : likes
|
|
||||||
C ||--|{ A : likes
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render a not-so-simple ER diagram', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
CUSTOMER ||--o{ INVOICE : "liable for"
|
|
||||||
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
|
||||||
INVOICE ||--|{ ORDER : covers
|
|
||||||
ORDER ||--|{ ORDER-ITEM : includes
|
|
||||||
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
|
||||||
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render a not-so-simple ER diagram without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
CUSTOMER ||--o{ INVOICE : "liable for"
|
|
||||||
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
|
||||||
INVOICE ||--|{ ORDER : covers
|
|
||||||
ORDER ||--|{ ORDER-ITEM : includes
|
|
||||||
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
|
||||||
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render multiple ER diagrams', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
[
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
ORDER ||--|{ LINE-ITEM : contains
|
|
||||||
`,
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
ORDER ||--|{ LINE-ITEM : contains
|
|
||||||
`,
|
|
||||||
],
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with blank or empty labels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
BOOK }|..|{ AUTHOR : ""
|
|
||||||
BOOK }|..|{ GENRE : " "
|
|
||||||
AUTHOR }|..|{ GENRE : " "
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities that have no relationships', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
DEAD_PARROT
|
|
||||||
HERMIT
|
|
||||||
RECLUSE
|
|
||||||
SOCIALITE }o--o{ SOCIALITE : "interacts with"
|
|
||||||
RECLUSE }o--o{ SOCIALITE : avoids
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with and without attributes', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
BOOK { string title }
|
|
||||||
AUTHOR }|..|{ BOOK : writes
|
|
||||||
BOOK { float price }
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with generic and array attributes', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
BOOK {
|
|
||||||
string title
|
|
||||||
string[] authors
|
|
||||||
type~T~ type
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with generic and array attributes without htmlLabels', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
BOOK {
|
|
||||||
string title
|
|
||||||
string[] authors
|
|
||||||
type~T~ type
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with length in attributes type', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CLUSTER {
|
|
||||||
varchar(99) name
|
|
||||||
string(255) description
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with length in attributes type without htmlLabels', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CLUSTER {
|
|
||||||
varchar(99) name
|
|
||||||
string(255) description
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities and attributes with big and small entity names', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
PRIVATE_FINANCIAL_INSTITUTION {
|
|
||||||
string name
|
|
||||||
int turnover
|
|
||||||
}
|
|
||||||
PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs
|
|
||||||
EMPLOYEE { bool officer_of_firm }
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities and attributes with big and small entity names without htmlLabels', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
PRIVATE_FINANCIAL_INSTITUTION {
|
|
||||||
string name
|
|
||||||
int turnover
|
|
||||||
}
|
|
||||||
PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs
|
|
||||||
EMPLOYEE { bool officer_of_firm }
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with attributes that begin with asterisk', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
BOOK {
|
|
||||||
int *id
|
|
||||||
string name
|
|
||||||
varchar(99) summary
|
|
||||||
}
|
|
||||||
BOOK }o..o{ STORE : soldBy
|
|
||||||
STORE {
|
|
||||||
int *id
|
|
||||||
string name
|
|
||||||
varchar(50) address
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ loglevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with attributes that begin with asterisk without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
BOOK {
|
|
||||||
int *id
|
|
||||||
string name
|
|
||||||
varchar(99) summary
|
|
||||||
}
|
|
||||||
BOOK }o..o{ STORE : soldBy
|
|
||||||
STORE {
|
|
||||||
int *id
|
|
||||||
string name
|
|
||||||
varchar(50) address
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ loglevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with keys', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
|
||||||
string name PK
|
|
||||||
}
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
|
||||||
BOOK {
|
|
||||||
float price
|
|
||||||
string author FK
|
|
||||||
string title PK
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with keys without htmlLabels', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
|
||||||
string name PK
|
|
||||||
}
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
|
||||||
BOOK {
|
|
||||||
float price
|
|
||||||
string author FK
|
|
||||||
string title PK
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with comments', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
|
||||||
string name "comment"
|
|
||||||
}
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
|
||||||
BOOK {
|
|
||||||
string author
|
|
||||||
string title "author comment"
|
|
||||||
float price "price comment"
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with comments without htmlLabels', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
|
||||||
string name "comment"
|
|
||||||
}
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
|
||||||
BOOK {
|
|
||||||
string author
|
|
||||||
string title "author comment"
|
|
||||||
float price "price comment"
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with keys and comments', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
|
||||||
string name PK "comment"
|
|
||||||
}
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
|
||||||
BOOK {
|
|
||||||
string description
|
|
||||||
float price "price comment"
|
|
||||||
string title PK "title comment"
|
|
||||||
string author FK
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with keys and comments without htmlLabels', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME {
|
|
||||||
string name PK "comment"
|
|
||||||
}
|
|
||||||
AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes
|
|
||||||
BOOK {
|
|
||||||
string description
|
|
||||||
float price "price comment"
|
|
||||||
string title PK "title comment"
|
|
||||||
string author FK
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with aliases', () => {
|
|
||||||
renderGraph(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
T1 one or zero to one or more T2 : test
|
|
||||||
T2 one or many optionally to zero or one T3 : test
|
|
||||||
T3 zero or more to zero or many T4 : test
|
|
||||||
T4 many(0) to many(1) T5 : test
|
|
||||||
T5 many optionally to one T6 : test
|
|
||||||
T6 only one optionally to only one T1 : test
|
|
||||||
T4 0+ to 1+ T6 : test
|
|
||||||
T1 1 to 1 T3 : test
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('1433: should render a simple ER diagram with a title', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`---
|
|
||||||
title: simple ER diagram
|
|
||||||
---
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
ORDER ||--|{ LINE-ITEM : contains
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with entity name aliases', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
p[Person] {
|
|
||||||
varchar(64) firstName
|
|
||||||
varchar(64) lastName
|
|
||||||
}
|
|
||||||
c["Customer Account"] {
|
|
||||||
varchar(128) email
|
|
||||||
}
|
|
||||||
p ||--o| c : has
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render relationship labels with line breaks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
p[Person] {
|
|
||||||
string firstName
|
|
||||||
string lastName
|
|
||||||
}
|
|
||||||
a["Customer Account"] {
|
|
||||||
string email
|
|
||||||
}
|
|
||||||
|
|
||||||
b["Customer Account Secondary"] {
|
|
||||||
string email
|
|
||||||
}
|
|
||||||
|
|
||||||
c["Customer Account Tertiary"] {
|
|
||||||
string email
|
|
||||||
}
|
|
||||||
|
|
||||||
d["Customer Account Nth"] {
|
|
||||||
string email
|
|
||||||
}
|
|
||||||
|
|
||||||
p ||--o| a : "has<br />one"
|
|
||||||
p ||--o| b : "has<br />one<br />two"
|
|
||||||
p ||--o| c : "has<br />one<br/>two<br />three"
|
|
||||||
p ||--o| d : "has<br />one<br />two<br/>three<br />...<br/>Nth"
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with unicode text', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
_**testẽζ➕Ø😀㌕ぼ**_ {
|
|
||||||
*__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***"
|
|
||||||
*string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs"
|
|
||||||
string last*Name*
|
|
||||||
string __phone__ UK
|
|
||||||
int _age_
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with unicode text without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
_**testẽζ➕Ø😀㌕ぼ**_ {
|
|
||||||
*__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***"
|
|
||||||
*string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs"
|
|
||||||
string last*Name*
|
|
||||||
string __phone__ UK
|
|
||||||
int _age_
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with relationships with unicode text', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
person[😀] {
|
|
||||||
string *first*Name
|
|
||||||
string _**last**Name_
|
|
||||||
}
|
|
||||||
a["*Customer Account*"] {
|
|
||||||
**string** ema*i*l
|
|
||||||
}
|
|
||||||
person ||--o| a : __hẽ😀__
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with relationships with unicode text without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
person[😀] {
|
|
||||||
string *first*Name
|
|
||||||
string _**last**Name_
|
|
||||||
}
|
|
||||||
a["*Customer Account*"] {
|
|
||||||
**string** ema*i*l
|
|
||||||
}
|
|
||||||
person ||--o| a : __hẽ😀__
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with TB direction', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
direction TB
|
|
||||||
CAR ||--|{ NAMED-DRIVER : allows
|
|
||||||
PERSON ||..o{ NAMED-DRIVER : is
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with BT direction', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
direction BT
|
|
||||||
CAR ||--|{ NAMED-DRIVER : allows
|
|
||||||
PERSON ||..o{ NAMED-DRIVER : is
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with LR direction', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
direction LR
|
|
||||||
CAR ||--|{ NAMED-DRIVER : allows
|
|
||||||
PERSON ||..o{ NAMED-DRIVER : is
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an ER diagram with RL direction', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
direction RL
|
|
||||||
CAR ||--|{ NAMED-DRIVER : allows
|
|
||||||
PERSON ||..o{ NAMED-DRIVER : is
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with styles applied from style statement', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]
|
|
||||||
style c,p fill:#f9f,stroke:blue, color:grey, font-size:24px,font-weight:bold
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with styles applied from style statement without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]
|
|
||||||
style c,p fill:#f9f,stroke:blue, color:grey, font-size:24px,font-weight:bold
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with styles applied from class statement', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]:::blue
|
|
||||||
classDef bold font-size:24px, font-weight: bold
|
|
||||||
classDef blue stroke:lightblue, color: #0000FF
|
|
||||||
class c,p bold
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with styles applied from class statement without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]:::blue
|
|
||||||
classDef bold font-size:24px, font-weight: bold
|
|
||||||
classDef blue stroke:lightblue, color: #0000FF
|
|
||||||
class c,p bold
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with the handDrawn look', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, look: 'handDrawn' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with the handDrawn look without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, look: 'handDrawn', htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with the handDrawn look and styles applied', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]:::blue
|
|
||||||
classDef bold font-size:24px, font-weight: bold
|
|
||||||
classDef blue stroke:black, fill:lightblue, color: #0000FF
|
|
||||||
class c,p bold
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, look: 'handDrawn' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render entities with the handDrawn look and styles applied without htmlLabels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
c[CUSTOMER]
|
|
||||||
p[PERSON]:::blue
|
|
||||||
classDef bold font-size:24px, font-weight: bold
|
|
||||||
classDef blue stroke:black, fill:lightblue, color: #0000FF
|
|
||||||
class c,p bold
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, look: 'handDrawn', htmlLabels: false }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render a not-so-simple ER diagram using elk', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
|
|
||||||
CUSTOMER ||--o{ ORDER : places
|
|
||||||
CUSTOMER ||--o{ INVOICE : "liable for"
|
|
||||||
DELIVERY-ADDRESS ||--o{ ORDER : receives
|
|
||||||
INVOICE ||--|{ ORDER : covers
|
|
||||||
ORDER ||--|{ ORDER-ITEM : includes
|
|
||||||
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
|
|
||||||
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, layout: 'elk' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -766,7 +766,10 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
|
|
||||||
it('should be possible to apply a style to an entity', function () {
|
it('should be possible to apply a style to an entity', function () {
|
||||||
const entityName = 'CUSTOMER';
|
const entityName = 'CUSTOMER';
|
||||||
erDiagram.parser.parse(`erDiagram\n${entityName}\nstyle ${entityName} color:red`);
|
erDiagram.parser.parse(`erDiagram
|
||||||
|
${entityName}
|
||||||
|
style ${entityName} color:red
|
||||||
|
`);
|
||||||
|
|
||||||
expect(erDb.getEntity(entityName).cssStyles).toEqual(['color:red']);
|
expect(erDb.getEntity(entityName).cssStyles).toEqual(['color:red']);
|
||||||
});
|
});
|
||||||
@@ -774,7 +777,10 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
it('should be possible to apply multiple styles to an entity at the same time', function () {
|
it('should be possible to apply multiple styles to an entity at the same time', function () {
|
||||||
const entityName = 'CUSTOMER';
|
const entityName = 'CUSTOMER';
|
||||||
erDiagram.parser.parse(
|
erDiagram.parser.parse(
|
||||||
`erDiagram\n${entityName}\nstyle ${entityName} color:red,stroke:blue,fill:#f9f`
|
`erDiagram
|
||||||
|
${entityName}
|
||||||
|
style ${entityName} color:red,stroke:blue,fill:#f9f
|
||||||
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(erDb.getEntity(entityName).cssStyles).toEqual(['color:red', 'stroke:blue', 'fill:#f9f']);
|
expect(erDb.getEntity(entityName).cssStyles).toEqual(['color:red', 'stroke:blue', 'fill:#f9f']);
|
||||||
@@ -783,7 +789,11 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
it('should be possible to apply multiple separately defined styles', function () {
|
it('should be possible to apply multiple separately defined styles', function () {
|
||||||
const entityName = 'CUSTOMER';
|
const entityName = 'CUSTOMER';
|
||||||
erDiagram.parser.parse(
|
erDiagram.parser.parse(
|
||||||
`erDiagram\n${entityName}\nstyle ${entityName} color:red\nstyle ${entityName} fill:#f9f`
|
`erDiagram
|
||||||
|
${entityName}
|
||||||
|
style ${entityName} color:red
|
||||||
|
style ${entityName} fill:#f9f
|
||||||
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(erDb.getEntity(entityName).cssStyles).toEqual(['color:red', 'fill:#f9f']);
|
expect(erDb.getEntity(entityName).cssStyles).toEqual(['color:red', 'fill:#f9f']);
|
||||||
@@ -823,7 +833,11 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
const firstEntity = 'ENTITY1';
|
const firstEntity = 'ENTITY1';
|
||||||
const secondEntity = 'ENTITY2';
|
const secondEntity = 'ENTITY2';
|
||||||
erDiagram.parser.parse(
|
erDiagram.parser.parse(
|
||||||
`erDiagram\n${firstEntity}\n${secondEntity}\nclassDef default fill:#f9f`
|
`erDiagram
|
||||||
|
${firstEntity}
|
||||||
|
${secondEntity}
|
||||||
|
classDef default fill:#f9f
|
||||||
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
const expectedOutput = new Map([
|
const expectedOutput = new Map([
|
||||||
@@ -845,7 +859,11 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
it('should be possible to define a class with styles', function () {
|
it('should be possible to define a class with styles', function () {
|
||||||
const className = 'myClass';
|
const className = 'myClass';
|
||||||
const styles = 'fill:#f9f, stroke: red, color: pink';
|
const styles = 'fill:#f9f, stroke: red, color: pink';
|
||||||
erDiagram.parser.parse(`erDiagram\nclassDef ${className} ${styles}`);
|
erDiagram.parser.parse(
|
||||||
|
`erDiagram
|
||||||
|
classDef ${className} ${styles}
|
||||||
|
`
|
||||||
|
);
|
||||||
|
|
||||||
const expectedOutput = new Map([
|
const expectedOutput = new Map([
|
||||||
[
|
[
|
||||||
@@ -865,7 +883,11 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
const firstClass = 'firstClass';
|
const firstClass = 'firstClass';
|
||||||
const secondClass = 'secondClass';
|
const secondClass = 'secondClass';
|
||||||
const styles = 'fill:#f9f, stroke: red, color: pink';
|
const styles = 'fill:#f9f, stroke: red, color: pink';
|
||||||
erDiagram.parser.parse(`erDiagram\nclassDef ${firstClass},${secondClass} ${styles}`);
|
erDiagram.parser.parse(
|
||||||
|
`erDiagram
|
||||||
|
classDef ${firstClass},${secondClass} ${styles}
|
||||||
|
`
|
||||||
|
);
|
||||||
|
|
||||||
const expectedOutput = new Map([
|
const expectedOutput = new Map([
|
||||||
[
|
[
|
||||||
|
|||||||
Reference in New Issue
Block a user