Repository: datnguye/dbterd (language: python)

Issue:
New output - D2
**Is your feature request related to a problem? Please describe.**
New output as D2

**Describe the solution you'd like**
D2 tools is [here](https://github.com/terrastruct/d2)

**Describe alternatives you've considered**
Existing outputs

**Additional context**
- Check [blogpost](https://terrastruct.com/blog/post/generate-diagrams-programmatically/)
- Sample code:
```
car: {
  shape: sql_table

  id: int {constraint: primary_key}
  last_updated: timestamp with time zone

  make: string
  model: string
  year: int
}

factory: {
  shape: sql_table

  id: int {constraint: primary_key}

  country: string
}

factory_car_support: {
  shape: sql_table

  id: int {constraint: primary_key}

  factory: int {constraint: foreign_key}
  car: int {constraint: foreign_key}
}

factory_car_support.factory -> factory.id
factory_car_support.car -> car.id
```



Discussion / hints:
![d2](https://user-images.githubusercontent.com/11532257/236390581-97cf0f1d-11a9-4969-b914-2f0408d2e24b.svg)


Fix patch:
diff --git a/README.md b/README.md
index 1aeed97..10db7c0 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # dbterd
 
-CLI to generate Diagram-as-a-code file ([DBML](https://dbdiagram.io/d), [Mermaid](https://mermaid-js.github.io/mermaid-live-editor/), [PlantUML](https://plantuml.com/ie-diagram)) from dbt artifact files (required: `manifest.json`, `catalog.json`)
+CLI to generate Diagram-as-a-code file ([DBML](https://dbdiagram.io/d), [Mermaid](https://mermaid-js.github.io/mermaid-live-editor/), [PlantUML](https://plantuml.com/ie-diagram), [GraphViz](https://graphviz.org/), [D2](https://d2lang.com/)) from dbt artifact files (required: `manifest.json`, `catalog.json`)
 
 [![PyPI version](https://badge.fury.io/py/dbterd.svg)](https://pypi.org/project/dbterd/)
 ![python-cli](https://img.shields.io/badge/CLI-Python-FFCE3E?labelColor=14354C&logo=python&logoColor=white)
diff --git a/dbterd/adapters/targets/constants.py b/dbterd/adapters/targets/constants.py
index ff618f9..9521bc0 100644
--- a/dbterd/adapters/targets/constants.py
+++ b/dbterd/adapters/targets/constants.py
@@ -2,3 +2,5 @@ class Strategies:
     DBML_TEST_RELATIONSHIP = "dbml_test_relationship"
     MERMAID_TEST_RELATIONSHIP = "mermaid_test_relationship"
     PLANTUML_TEST_RELATIONSHIP = "plantuml_test_relationship"
+    D2_TEST_RELATIONSHIP = "d2_test_relationship"
+    GRAPHVIZ_TEST_RELATIONSHIP = "graphviz_test_relationship"
diff --git a/dbterd/adapters/targets/d2/__init__.py b/dbterd/adapters/targets/d2/__init__.py
new file mode 100644
index 0000000..88dc512
--- /dev/null
+++ b/dbterd/adapters/targets/d2/__init__.py
@@ -0,0 +1,8 @@
+from dbterd.adapters.targets.constants import Strategies
+from dbterd.adapters.targets.d2 import d2_test_relationship
+from dbterd.adapters.targets.default import default
+
+run_operation_default = default
+run_operation_dispatcher = {
+    Strategies.D2_TEST_RELATIONSHIP: d2_test_relationship.run,
+}
diff --git a/dbterd/adapters/targets/graphviz/__init__.py b/dbterd/adapters/targets/graphviz/__init__.py
new file mode 100644
index 0000000..fb09012
--- /dev/null
+++ b/dbterd/adapters/targets/graphviz/__init__.py
@@ -0,0 +1,8 @@
+from dbterd.adapters.targets.constants import Strategies
+from dbterd.adapters.targets.default import default
+from dbterd.adapters.targets.graphviz import graphviz_test_relationship
+
+run_operation_default = default
+run_operation_dispatcher = {
+    Strategies.GRAPHVIZ_TEST_RELATIONSHIP: graphviz_test_relationship.run,
+}
diff --git a/docs/index.md b/docs/index.md
index c496e51..f8ce435 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,6 +1,6 @@
 # dbterd
 
-CLI to generate Diagram-as-a-code file ([DBML](https://dbdiagram.io/d), [Mermaid](https://mermaid-js.github.io/mermaid-live-editor/), [PlantUML](https://plantuml.com/ie-diagram)) from dbt artifact files (required: `manifest.json`, `catalog.json`)
+CLI to generate Diagram-as-a-code file ([DBML](https://dbdiagram.io/d), [Mermaid](https://mermaid-js.github.io/mermaid-live-editor/), [PlantUML](https://plantuml.com/ie-diagram), [GraphViz](https://graphviz.org/), [D2](https://d2lang.com/)) from dbt artifact files (required: `manifest.json`, `catalog.json`)
 
 [![PyPI version](https://badge.fury.io/py/dbterd.svg)](https://pypi.org/project/dbterd/)
 ![python-cli](https://img.shields.io/badge/CLI-Python-FFCE3E?labelColor=14354C&logo=python&logoColor=white)
diff --git a/docs/nav/guide/targets/generate-d2.md b/docs/nav/guide/targets/generate-d2.md
new file mode 100644
index 0000000..df74476
--- /dev/null
+++ b/docs/nav/guide/targets/generate-d2.md
@@ -0,0 +1,38 @@
+# Generate D2 ERD
+
+## 1. Install D2 CLI
+
+```bash
+# With --dry-run the install script will print the commands it will use
+# to install without actually installing so you know what it's going to do.
+curl -fsSL https://d2lang.com/install.sh | sh -s -- --dry-run
+# If things look good, install for real.
+curl -fsSL https://d2lang.com/install.sh | sh -s --
+```
+
+> Check [installations](https://github.com/terrastruct/d2/blob/master/docs/INSTALL.md) for more details
+
+## 2. Generate D2 ERD content
+
+```bash
+dbterd run -t d2 -ad "samples/dbtresto" -o "target" -s schema:dbt.mart
+# Expected: ./target/output.d2
+```
+
+## 2. Export to SVG
+
+```bash
+d2 -w ./target/output.d2 ./target/output.svg
+```
+
+### 3. Embeded into Markdown
+
+```markdown
+# Sample D2 ERD
+
+![d2](./target/output.svg)
+```
+
+Sample Output:
+
+![d2](https://github.com/datnguye/dbterd/blob/main/samples/dbtresto/d2.svg)
diff --git a/docs/nav/guide/targets/generate-dbml.md b/docs/nav/guide/targets/generate-dbml.md
index 4f14a78..e2767e0 100644
--- a/docs/nav/guide/targets/generate-dbml.md
+++ b/docs/nav/guide/targets/generate-dbml.md
@@ -1,29 +1,35 @@
 # Generate DBML
 
-#### 1. Produce your manifest json
+## 1. Produce your manifest json
 
 In your dbt project (I am using dbt-resto/[integration_tests](https://github.com/datnguye/dbt-resto) for demo purpose), try to build the docs:
+
 ```bash
 dbt docs generate
 ```
 
-#### 2. Generate DBML
+## 2. Generate DBML
+
 Copy `manifest.json` and `catalog.json` into a specific folder OR do nothing and let's assume we're using `dbt/target` directory, and run
-```
+
+```bash
 dbterd run -ad "/path/to/dbt/target" -o "/path/to/output"
 # dbterd run -ad "samples/dbtresto" -s model.dbt_resto -ns model.dbt_resto.staging
 ```
 
 File `./target/output.dbml` will be generated as the result
 
-#### 3. Build database docs site (Optional)
+## 3. Build database docs site (Optional)
+
 Assuming you're already familiar with [dbdocs](https://dbdocs.io/docs#installation)
-```
+
+```bash
 dbdocs build "/path/to/output/output.dbml"
 # dbdocs build "./target/output.dbml"
 ```
 
 Your terminal should provide the info as below:
+
 ```bash
 √ Parsing file content
 ? Project name:  poc
diff --git a/docs/nav/guide/targets/generate-graphviz.md b/docs/nav/guide/targets/generate-graphviz.md
new file mode 100644
index 0000000..d7fd3e8
--- /dev/null
+++ b/docs/nav/guide/targets/generate-graphviz.md
@@ -0,0 +1,34 @@
+# Generate GraphViz ERD
+
+## 1. Install GraphViz CLI
+
+```bash
+sudo apt install graphviz
+```
+
+> Check [installations](https://graphviz.org/download/#linux) for more details
+
+## 2. Generate GraphViz ERD content
+
+```bash
+dbterd run -t graphviz -ad "samples/dbtresto" -o "target" -s schema:dbt.mart
+# Expected: ./target/output.graphviz
+```
+
+## 2. Export to PNG
+
+```bash
+dot -Tpng ./target/output.d2 > ./target/output.png
+```
+
+### 3. Embeded into Markdown
+
+```markdown
+# Sample GraphViz ERD
+
+![graphviz](./target/output.png)
+```
+
+Sample Output:
+
+![graphviz](https://github.com/datnguye/dbterd/blob/main/samples/dbtresto/graphviz.png)
diff --git a/mkdocs.yml b/mkdocs.yml
index d8b3f3c..f0d2fc0 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -15,9 +15,11 @@ nav:
     - User Guide:
       - CLI Reference: nav/guide/cli-references.md
       - Generate the Targets:
-        - Generate DBML: nav/guide/targets/generate-dbml.md
-        - Generate Mermaid: nav/guide/targets/generate-markdown-mermaid-erd.md
-        - Generate PlantUML: nav/guide/targets/generate-plantuml.md
+        - DBML: nav/guide/targets/generate-dbml.md
+        - Mermaid: nav/guide/targets/generate-markdown-mermaid-erd.md
+        - PlantUML: nav/guide/targets/generate-plantuml.md
+        - D2: nav/guide/targets/generate-d2.md
+        - GraphViz: nav/guide/targets/generate-graphviz.md
       - Metadata:
         - Ignore Tests: nav/metadata/ignore_in_erd.md
         - Relationship Types: nav/metadata/relationship_type.md
diff --git a/samples/dbtresto/d2.svg b/samples/dbtresto/d2.svg
new file mode 100644
index 0000000..a97a120
--- /dev/null
+++ b/samples/dbtresto/d2.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMidYMid meet" viewBox="0 0 2868 1403"><svg id="d2-svg" class="d2-1909543138" width="2868" height="1403" viewBox="16 -101 2868 1403"><rect x="16.000000" y="-101.000000" width="2868.000000" height="1403.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
+.d2-1909543138 .text {
+	font-family: "d2-1909543138-font-regular";
+}
+@font-face {
+	font-family: d2-1909543138-font-regular;
+	src: url("data:application/font-woff;base64,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");
+}
+.d2-1909543138 .text-italic {
+	font-family: "d2-1909543138-font-italic";
+}
+@font-face {
+	font-family: d2-1909543138-font-italic;
+	src: url("data:application/font-woff;base64,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");
+}]]></style><style type="text/css"><![CDATA[.shape {
+  shape-rendering: geometricPrecision;
+  stroke-linejoin: round;
+}
+.connection {
+  stroke-linecap: round;
+  stroke-linejoin: round;
+}
+.blend {
+  mix-blend-mode: multiply;
+  opacity: 0.5;
+}
+
+		.d2-1909543138 .fill-N1{fill:#0A0F25;}
+		.d2-1909543138 .fill-N2{fill:#676C7E;}
+		.d2-1909543138 .fill-N3{fill:#9499AB;}
+		.d2-1909543138 .fill-N4{fill:#CFD2DD;}
+		.d2-1909543138 .fill-N5{fill:#DEE1EB;}
+		.d2-1909543138 .fill-N6{fill:#EEF1F8;}
+		.d2-1909543138 .fill-N7{fill:#FFFFFF;}
+		.d2-1909543138 .fill-B1{fill:#0D32B2;}
+		.d2-1909543138 .fill-B2{fill:#0D32B2;}
+		.d2-1909543138 .fill-B3{fill:#E3E9FD;}
+		.d2-1909543138 .fill-B4{fill:#E3E9FD;}
+		.d2-1909543138 .fill-B5{fill:#EDF0FD;}
+		.d2-1909543138 .fill-B6{fill:#F7F8FE;}
+		.d2-1909543138 .fill-AA2{fill:#4A6FF3;}
+		.d2-1909543138 .fill-AA4{fill:#EDF0FD;}
+		.d2-1909543138 .fill-AA5{fill:#F7F8FE;}
+		.d2-1909543138 .fill-AB4{fill:#EDF0FD;}
+		.d2-1909543138 .fill-AB5{fill:#F7F8FE;}
+		.d2-1909543138 .stroke-N1{stroke:#0A0F25;}
+		.d2-1909543138 .stroke-N2{stroke:#676C7E;}
+		.d2-1909543138 .stroke-N3{stroke:#9499AB;}
+		.d2-1909543138 .stroke-N4{stroke:#CFD2DD;}
+		.d2-1909543138 .stroke-N5{stroke:#DEE1EB;}
+		.d2-1909543138 .stroke-N6{stroke:#EEF1F8;}
+		.d2-1909543138 .stroke-N7{stroke:#FFFFFF;}
+		.d2-1909543138 .stroke-B1{stroke:#0D32B2;}
+		.d2-1909543138 .stroke-B2{stroke:#0D32B2;}
+		.d2-1909543138 .stroke-B3{stroke:#E3E9FD;}
+		.d2-1909543138 .stroke-B4{stroke:#E3E9FD;}
+		.d2-1909543138 .stroke-B5{stroke:#EDF0FD;}
+		.d2-1909543138 .stroke-B6{stroke:#F7F8FE;}
+		.d2-1909543138 .stroke-AA2{stroke:#4A6FF3;}
+		.d2-1909543138 .stroke-AA4{stroke:#EDF0FD;}
+		.d2-1909543138 .stroke-AA5{stroke:#F7F8FE;}
+		.d2-1909543138 .stroke-AB4{stroke:#EDF0FD;}
+		.d2-1909543138 .stroke-AB5{stroke:#F7F8FE;}
+		.d2-1909543138 .background-color-N1{background-color:#0A0F25;}
+		.d2-1909543138 .background-color-N2{background-color:#676C7E;}
+		.d2-1909543138 .background-color-N3{background-color:#9499AB;}
+		.d2-1909543138 .background-color-N4{background-color:#CFD2DD;}
+		.d2-1909543138 .background-color-N5{background-color:#DEE1EB;}
+		.d2-1909543138 .background-color-N6{background-color:#EEF1F8;}
+		.d2-1909543138 .background-color-N7{background-color:#FFFFFF;}
+		.d2-1909543138 .background-color-B1{background-color:#0D32B2;}
+		.d2-1909543138 .background-color-B2{background-color:#0D32B2;}
+		.d2-1909543138 .background-color-B3{background-color:#E3E9FD;}
+		.d2-1909543138 .background-color-B4{background-color:#E3E9FD;}
+		.d2-1909543138 .background-color-B5{background-color:#EDF0FD;}
+		.d2-1909543138 .background-color-B6{background-color:#F7F8FE;}
+		.d2-1909543138 .background-color-AA2{background-color:#4A6FF3;}
+		.d2-1909543138 .background-color-AA4{background-color:#EDF0FD;}
+		.d2-1909543138 .background-color-AA5{background-color:#F7F8FE;}
+		.d2-1909543138 .background-color-AB4{background-color:#EDF0FD;}
+		.d2-1909543138 .background-color-AB5{background-color:#F7F8FE;}
+		.d2-1909543138 .color-N1{color:#0A0F25;}
+		.d2-1909543138 .color-N2{color:#676C7E;}
+		.d2-1909543138 .color-N3{color:#9499AB;}
+		.d2-1909543138 .color-N4{color:#CFD2DD;}
+		.d2-1909543138 .color-N5{color:#DEE1EB;}
+		.d2-1909543138 .color-N6{color:#EEF1F8;}
+		.d2-1909543138 .color-N7{color:#FFFFFF;}
+		.d2-1909543138 .color-B1{color:#0D32B2;}
+		.d2-1909543138 .color-B2{color:#0D32B2;}
+		.d2-1909543138 .color-B3{color:#E3E9FD;}
+		.d2-1909543138 .color-B4{color:#E3E9FD;}
+		.d2-1909543138 .color-B5{color:#EDF0FD;}
+		.d2-1909543138 .color-B6{color:#F7F8FE;}
+		.d2-1909543138 .color-AA2{color:#4A6FF3;}
+		.d2-1909543138 .color-AA4{color:#EDF0FD;}
+		.d2-1909543138 .color-AA5{color:#F7F8FE;}
+		.d2-1909543138 .color-AB4{color:#EDF0FD;}
+		.d2-1909543138 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="&#34;model.dbt_resto.dim_box&#34;"><g class="shape" ><rect x="2038.000000" y="769.000000" width="309.000000" height="432.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="2038.000000" y="769.000000" width="309.000000" height="36.000000" class="class_header fill-N1" /><text x="2048.000000" y="794.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.dim_box</text><text x="2048.000000" y="828.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_key</text><text x="2253.000000" y="828.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="2327.000000" y="828.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="841.000000" y2="841.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="864.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_id</text><text x="2253.000000" y="864.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="2327.000000" y="864.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="877.000000" y2="877.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="900.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_date</text><text x="2253.000000" y="900.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="2327.000000" y="900.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="913.000000" y2="913.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="936.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_numbers</text><text x="2253.000000" y="936.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">nvarchar</text><text x="2327.000000" y="936.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="949.000000" y2="949.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="972.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_1</text><text x="2253.000000" y="972.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="972.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="985.000000" y2="985.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="1008.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_2</text><text x="2253.000000" y="1008.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="1008.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="1021.000000" y2="1021.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="1044.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_3</text><text x="2253.000000" y="1044.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="1044.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="1057.000000" y2="1057.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="1080.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_4</text><text x="2253.000000" y="1080.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="1080.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="1093.000000" y2="1093.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="1116.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_5</text><text x="2253.000000" y="1116.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="1116.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="1129.000000" y2="1129.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="1152.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_6</text><text x="2253.000000" y="1152.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="1152.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="1165.000000" y2="1165.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2048.000000" y="1188.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_number_7</text><text x="2253.000000" y="1188.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2327.000000" y="1188.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2038.000000" x2="2347.000000" y1="1201.000000" y2="1201.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.dim_date&#34;"><g class="shape" ><rect x="479.000000" y="841.000000" width="310.000000" height="288.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="479.000000" y="841.000000" width="310.000000" height="36.000000" class="class_header fill-N1" /><text x="489.000000" y="866.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.dim_date</text><text x="489.000000" y="900.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">date_key</text><text x="663.000000" y="900.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="769.000000" y="900.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="913.000000" y2="913.000000" class=" stroke-N1" style="stroke-width:2" /><text x="489.000000" y="936.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_date</text><text x="663.000000" y="936.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="769.000000" y="936.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="949.000000" y2="949.000000" class=" stroke-N1" style="stroke-width:2" /><text x="489.000000" y="972.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_day</text><text x="663.000000" y="972.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="769.000000" y="972.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="985.000000" y2="985.000000" class=" stroke-N1" style="stroke-width:2" /><text x="489.000000" y="1008.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_week</text><text x="663.000000" y="1008.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="769.000000" y="1008.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="1021.000000" y2="1021.000000" class=" stroke-N1" style="stroke-width:2" /><text x="489.000000" y="1044.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_month</text><text x="663.000000" y="1044.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="769.000000" y="1044.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="1057.000000" y2="1057.000000" class=" stroke-N1" style="stroke-width:2" /><text x="489.000000" y="1080.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_month_name</text><text x="663.000000" y="1080.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="769.000000" y="1080.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="1093.000000" y2="1093.000000" class=" stroke-N1" style="stroke-width:2" /><text x="489.000000" y="1116.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_year</text><text x="663.000000" y="1116.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="769.000000" y="1116.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="479.000000" x2="789.000000" y1="1129.000000" y2="1129.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.dim_prize&#34;"><g class="shape" ><rect x="2407.000000" y="913.000000" width="316.000000" height="144.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="2407.000000" y="913.000000" width="316.000000" height="36.000000" class="class_header fill-N1" /><text x="2417.000000" y="938.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.dim_prize</text><text x="2417.000000" y="972.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">prize_key</text><text x="2535.000000" y="972.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="2703.000000" y="972.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2407.000000" x2="2723.000000" y1="985.000000" y2="985.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2417.000000" y="1008.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">prize_name</text><text x="2535.000000" y="1008.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">nvarchar</text><text x="2703.000000" y="1008.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2407.000000" x2="2723.000000" y1="1021.000000" y2="1021.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2417.000000" y="1044.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">prize_order</text><text x="2535.000000" y="1044.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2703.000000" y="1044.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2407.000000" x2="2723.000000" y1="1057.000000" y2="1057.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.fact_number&#34;"><g class="shape" ><rect x="596.000000" y="0.000000" width="347.000000" height="648.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="596.000000" y="0.000000" width="347.000000" height="36.000000" class="class_header fill-N1" /><text x="606.000000" y="25.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.fact_number</text><text x="606.000000" y="59.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">number_value</text><text x="825.000000" y="59.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="59.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="72.000000" y2="72.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="95.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence</text><text x="825.000000" y="95.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="95.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="108.000000" y2="108.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="131.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_1</text><text x="825.000000" y="131.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="131.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="144.000000" y2="144.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="167.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_2</text><text x="825.000000" y="167.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="167.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="180.000000" y2="180.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="203.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_3</text><text x="825.000000" y="203.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="203.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="216.000000" y2="216.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="239.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_4</text><text x="825.000000" y="239.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="239.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="252.000000" y2="252.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="275.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_5</text><text x="825.000000" y="275.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="275.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="288.000000" y2="288.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="311.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_6</text><text x="825.000000" y="311.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="311.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="324.000000" y2="324.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="347.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence_pos_7</text><text x="825.000000" y="347.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="923.000000" y="347.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="360.000000" y2="360.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="383.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance</text><text x="825.000000" y="383.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="383.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="396.000000" y2="396.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="419.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_1</text><text x="825.000000" y="419.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="419.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="432.000000" y2="432.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="455.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_2</text><text x="825.000000" y="455.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="455.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="468.000000" y2="468.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="491.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_3</text><text x="825.000000" y="491.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="491.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="504.000000" y2="504.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="527.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_4</text><text x="825.000000" y="527.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="527.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="540.000000" y2="540.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="563.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_5</text><text x="825.000000" y="563.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="563.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="576.000000" y2="576.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="599.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_6</text><text x="825.000000" y="599.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="599.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="612.000000" y2="612.000000" class=" stroke-N1" style="stroke-width:2" /><text x="606.000000" y="635.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance_pos_7</text><text x="825.000000" y="635.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="923.000000" y="635.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="596.000000" x2="943.000000" y1="648.000000" y2="648.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.fact_number_forecast&#34;"><g class="shape" ><rect x="1003.000000" y="18.000000" width="445.000000" height="612.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="1003.000000" y="18.000000" width="445.000000" height="36.000000" class="class_header fill-N1" /><text x="1013.000000" y="43.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.fact_number_forecast</text><text x="1013.000000" y="77.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_date</text><text x="1258.000000" y="77.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="1428.000000" y="77.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="90.000000" y2="90.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="113.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_date</text><text x="1258.000000" y="113.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="1428.000000" y="113.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="126.000000" y2="126.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="149.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_numbers</text><text x="1258.000000" y="149.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="1428.000000" y="149.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="162.000000" y2="162.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="185.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_numbers</text><text x="1258.000000" y="185.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">nvarchar</text><text x="1428.000000" y="185.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="198.000000" y2="198.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="221.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_1</text><text x="1258.000000" y="221.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="221.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="234.000000" y2="234.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="257.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_number_1</text><text x="1258.000000" y="257.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="257.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="270.000000" y2="270.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="293.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_2</text><text x="1258.000000" y="293.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="293.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="306.000000" y2="306.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="329.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_number_2</text><text x="1258.000000" y="329.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="329.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="342.000000" y2="342.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="365.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_3</text><text x="1258.000000" y="365.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="365.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="378.000000" y2="378.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="401.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_number_3</text><text x="1258.000000" y="401.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="401.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="414.000000" y2="414.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="437.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_4</text><text x="1258.000000" y="437.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="437.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="450.000000" y2="450.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="473.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_number_4</text><text x="1258.000000" y="473.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="473.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="486.000000" y2="486.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="509.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_5</text><text x="1258.000000" y="509.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="509.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="522.000000" y2="522.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="545.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_number_5</text><text x="1258.000000" y="545.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="545.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="558.000000" y2="558.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="581.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_6</text><text x="1258.000000" y="581.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="581.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="594.000000" y2="594.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1013.000000" y="617.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_box_result_number_6</text><text x="1258.000000" y="617.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1428.000000" y="617.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1003.000000" x2="1448.000000" y1="630.000000" y2="630.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.fact_number_scoring&#34;"><g class="shape" ><rect x="1508.000000" y="36.000000" width="437.000000" height="576.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="1508.000000" y="36.000000" width="437.000000" height="36.000000" class="class_header fill-N1" /><text x="1518.000000" y="61.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.fact_number_scoring</text><text x="1518.000000" y="95.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">fact_key</text><text x="1659.000000" y="95.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="1925.000000" y="95.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="108.000000" y2="108.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="131.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">forecast_date</text><text x="1659.000000" y="131.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="1925.000000" y="131.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="144.000000" y2="144.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="167.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">number_value</text><text x="1659.000000" y="167.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="167.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="180.000000" y2="180.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="203.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">score_1</text><text x="1659.000000" y="203.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="203.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="216.000000" y2="216.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="239.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">score_2</text><text x="1659.000000" y="239.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="239.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="252.000000" y2="252.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="275.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">score_3</text><text x="1659.000000" y="275.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="275.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="288.000000" y2="288.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="311.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">score_4</text><text x="1659.000000" y="311.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="311.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="324.000000" y2="324.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="347.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">score_5</text><text x="1659.000000" y="347.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="347.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="360.000000" y2="360.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="383.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">score_6</text><text x="1659.000000" y="383.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="1925.000000" y="383.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="396.000000" y2="396.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="419.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">rank_pos_1</text><text x="1659.000000" y="419.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="1925.000000" y="419.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="432.000000" y2="432.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="455.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">rank_pos_2</text><text x="1659.000000" y="455.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="1925.000000" y="455.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="468.000000" y2="468.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="491.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">rank_pos_3</text><text x="1659.000000" y="491.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="1925.000000" y="491.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="504.000000" y2="504.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="527.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">rank_pos_4</text><text x="1659.000000" y="527.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="1925.000000" y="527.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="540.000000" y2="540.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="563.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">rank_pos_5</text><text x="1659.000000" y="563.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="1925.000000" y="563.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="576.000000" y2="576.000000" class=" stroke-N1" style="stroke-width:2" /><text x="1518.000000" y="599.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">rank_pos_6</text><text x="1659.000000" y="599.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="1925.000000" y="599.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="1508.000000" x2="1945.000000" y1="612.000000" y2="612.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.fact_result&#34;"><g class="shape" ><rect x="2007.000000" y="162.000000" width="325.000000" height="324.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="2007.000000" y="162.000000" width="325.000000" height="36.000000" class="class_header fill-N1" /><text x="2017.000000" y="187.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.fact_result</text><text x="2017.000000" y="221.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">fact_result_key</text><text x="2167.000000" y="221.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="2312.000000" y="221.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="234.000000" y2="234.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="257.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_key</text><text x="2167.000000" y="257.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="2312.000000" y="257.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="270.000000" y2="270.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="293.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">prize_key</text><text x="2167.000000" y="293.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">varchar</text><text x="2312.000000" y="293.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="306.000000" y2="306.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="329.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">date_key</text><text x="2167.000000" y="329.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="2312.000000" y="329.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="342.000000" y2="342.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="365.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">no_of_won</text><text x="2167.000000" y="365.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2312.000000" y="365.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="378.000000" y2="378.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="401.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">prize_value</text><text x="2167.000000" y="401.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="2312.000000" y="401.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="414.000000" y2="414.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="437.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">prize_paid</text><text x="2167.000000" y="437.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">float</text><text x="2312.000000" y="437.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="450.000000" y2="450.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2017.000000" y="473.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">is_prize_taken</text><text x="2167.000000" y="473.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2312.000000" y="473.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2007.000000" x2="2332.000000" y1="486.000000" y2="486.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="&#34;model.dbt_resto.fact_set_number&#34;"><g class="shape" ><rect x="2392.000000" y="252.000000" width="391.000000" height="144.000000" class="shape stroke-N1 fill-N7" style="stroke-width:2;" /><rect x="2392.000000" y="252.000000" width="391.000000" height="36.000000" class="class_header fill-N1" /><text x="2402.000000" y="277.750000" class="text fill-N7" style="text-anchor:start;font-size:24px">model.dbt_resto.fact_set_number</text><text x="2402.000000" y="311.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">box_result_numbers</text><text x="2595.000000" y="311.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">nvarchar</text><text x="2763.000000" y="311.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2392.000000" x2="2783.000000" y1="324.000000" y2="324.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2402.000000" y="347.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">occurrence</text><text x="2595.000000" y="347.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">int</text><text x="2763.000000" y="347.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2392.000000" x2="2783.000000" y1="360.000000" y2="360.000000" class=" stroke-N1" style="stroke-width:2" /><text x="2402.000000" y="383.000000" class="text fill-B2" style="text-anchor:start;font-size:20px">last_appearance</text><text x="2595.000000" y="383.000000" class="text fill-N2" style="text-anchor:start;font-size:20px">date</text><text x="2763.000000" y="383.000000" class="text fill-AA2" style="text-anchor:end;font-size:20px;letter-spacing:2px" /><line x1="2392.000000" x2="2783.000000" y1="396.000000" y2="396.000000" class=" stroke-N1" style="stroke-width:2" /></g></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 594.018095 425.204157 C 201.950000 651.640781 178.700000 747.700000 475.952988 902.651026" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="209.500000" y="653.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance = date_key</text></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[1]"><path d="M 594.281680 485.816762 C 401.950000 663.691762 380.500000 735.100000 485.650545 838.692759" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="415.500000" y="656.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance_pos_1 = date_key</text></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[2]"><path d="M 648.265216 649.874953 C 630.992263 696.400000 627.300000 735.100000 630.379754 837.501808" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="627.500000" y="749.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance_pos_2 = date_key</text></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[3]"><path d="M 879.647212 649.894265 C 895.401105 696.400000 874.100000 735.100000 775.262420 838.607072" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="856.500000" y="759.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance_pos_3 = date_key</text></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[4]"><path d="M 944.197465 490.812896 C 1126.550000 664.686547 1095.850000 747.875244 792.807996 903.548470" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="1094.500000" y="754.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance_pos_4 = date_key</text></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[5]"><path d="M 944.488618 423.636597 C 1344.950000 651.329612 1314.250000 753.234206 793.036130 930.880598" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="1316.500000" y="752.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance_pos_5 = date_key</text></g><g id="(&#34;model.dbt_resto.fact_number&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[6]"><path d="M 944.603704 395.028179 C 1563.350000 645.655465 1532.650000 755.894535 793.125953 944.484251" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="1534.500000" y="753.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">last_appearance_pos_6 = date_key</text></g><g id="(&#34;model.dbt_resto.fact_result&#34; -&gt; &#34;model.dbt_resto.dim_box&#34;)[0]"><path d="M 2179.453304 487.996508 C 2189.867035 664.000000 2192.500000 720.700000 2192.500000 765.500000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="2187.500000" y="633.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">box_key = box_key</text></g><g id="(&#34;model.dbt_resto.fact_result&#34; -&gt; &#34;model.dbt_resto.dim_prize&#34;)[0]"><path d="M 2333.683574 483.474913 C 2518.450000 663.216066 2565.000000 749.500000 2565.000000 909.500000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="2518.500000" y="670.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">prize_key = prize_key</text></g><g id="(&#34;model.dbt_resto.fact_result&#34; -&gt; &#34;model.dbt_resto.dim_date&#34;)[0]"><path d="M 2068.952348 487.703050 C 1960.400195 664.000000 1704.250000 757.200192 793.162319 951.168041" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1909543138)" /><text x="1482.000000" y="810.000000" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">date_key = date_key</text></g><mask id="d2-1909543138" maskUnits="userSpaceOnUse" x="16" y="-101" width="2868" height="1403">
+<rect x="16" y="-101" width="2868" height="1403" fill="white"></rect>
+<rect x="116.000000" y="637.000000" width="187" height="21" fill="black"></rect>
+<rect x="299.000000" y="640.000000" width="233" height="21" fill="black"></rect>
+<rect x="511.000000" y="733.000000" width="233" height="21" fill="black"></rect>
+<rect x="740.000000" y="743.000000" width="233" height="21" fill="black"></rect>
+<rect x="978.000000" y="738.000000" width="233" height="21" fill="black"></rect>
+<rect x="1200.000000" y="736.000000" width="233" height="21" fill="black"></rect>
+<rect x="1418.000000" y="737.000000" width="233" height="21" fill="black"></rect>
+<rect x="2126.000000" y="617.000000" width="123" height="21" fill="black"></rect>
+<rect x="2448.000000" y="654.000000" width="141" height="21" fill="black"></rect>
+<rect x="1414.000000" y="794.000000" width="136" height="21" fill="black"></rect>
+</mask></svg></svg>
diff --git a/samples/dbtresto/graphviz.png b/samples/dbtresto/graphviz.png
new file mode 100644
index 0000000..7c7ea9f
Binary files /dev/null and b/samples/dbtresto/graphviz.png differ


Test patch:
diff --git a/dbterd/adapters/targets/d2/d2_test_relationship.py b/dbterd/adapters/targets/d2/d2_test_relationship.py
new file mode 100644
index 0000000..3a7feeb
--- /dev/null
+++ b/dbterd/adapters/targets/d2/d2_test_relationship.py
@@ -0,0 +1,58 @@
+from dbterd.adapters.algos import test_relationship
+
+
+def run(manifest, catalog, **kwargs):
+    """Parse dbt artifacts and export D2 file
+
+    Args:
+        manifest (dict): Manifest json
+        catalog (dict): Catalog json
+
+    Returns:
+        Tuple(str, str): File name and the D2 content
+    """
+    return ("output.d2", parse(manifest, catalog, **kwargs))
+
+
+def parse(manifest, catalog, **kwargs):
+    """Get the D2 content from dbt artifacts
+
+    Args:
+        manifest (dict): Manifest json
+        catalog (dict): Catalog json
+
+    Returns:
+        str: D2 content
+    """
+    tables, relationships = test_relationship.parse(
+        manifest=manifest, catalog=catalog, **kwargs
+    )
+
+    # Build D2 content
+    # https://play.d2lang.com/?script=qlDQtVOo5AIEAAD__w%3D%3D&, https://github.com/terrastruct/d2
+    d2 = ""
+    for table in tables:
+        d2 += '"{table}": {{\n  shape: sql_table\n{columns}\n}}\n'.format(
+            table=table.name,
+            columns="\n".join([f"  {x.name}: {x.data_type}" for x in table.columns]),
+        )
+
+    for rel in relationships:
+        key_from = f'"{rel.table_map[1]}"'
+        key_to = f'"{rel.table_map[0]}"'
+        connector = f"{rel.column_map[1]} = {rel.column_map[0]}"
+        d2 += f'{key_from} {get_rel_symbol(rel.type)} {key_to}: "{connector}"\n'
+
+    return d2
+
+
+def get_rel_symbol(relationship_type: str) -> str:
+    """Get D2 relationship symbol
+
+    Args:
+        relationship_type (str): relationship type
+
+    Returns:
+        str: Relation symbol supported in D2
+    """
+    return "->"  # no supports for rel type
diff --git a/dbterd/adapters/targets/dbml/dbml_test_relationship.py b/dbterd/adapters/targets/dbml/dbml_test_relationship.py
index ce856e5..34e18af 100644
--- a/dbterd/adapters/targets/dbml/dbml_test_relationship.py
+++ b/dbterd/adapters/targets/dbml/dbml_test_relationship.py
@@ -32,7 +32,7 @@ def parse(manifest, catalog, **kwargs):
     dbml = "//Tables (based on the selection criteria)\n"
     for table in tables:
         dbml += f"//--configured at schema: {table.database}.{table.schema}\n"
-        dbml += """Table \"{table}\" {{\n{columns}\n}}\n""".format(
+        dbml += 'Table "{table}" {{\n{columns}\n}}\n'.format(
             table=table.name,
             columns="\n".join(
                 [
diff --git a/dbterd/adapters/targets/graphviz/graphviz_test_relationship.py b/dbterd/adapters/targets/graphviz/graphviz_test_relationship.py
new file mode 100644
index 0000000..d6c6f50
--- /dev/null
+++ b/dbterd/adapters/targets/graphviz/graphviz_test_relationship.py
@@ -0,0 +1,91 @@
+from dbterd.adapters.algos import test_relationship
+
+
+def run(manifest, catalog, **kwargs):
+    """Parse dbt artifacts and export GraphViz file
+
+    Args:
+        manifest (dict): Manifest json
+        catalog (dict): Catalog json
+
+    Returns:
+        Tuple(str, str): File name and the GraphViz content
+    """
+    return ("output.graphviz", parse(manifest, catalog, **kwargs))
+
+
+def parse(manifest, catalog, **kwargs):
+    """Get the GraphViz content from dbt artifacts
+
+    Args:
+        manifest (dict): Manifest json
+        catalog (dict): Catalog json
+
+    Returns:
+        str: GraphViz content
+    """
+    tables, relationships = test_relationship.parse(
+        manifest=manifest, catalog=catalog, **kwargs
+    )
+
+    # Build GraphViz content
+    # https://dreampuf.github.io/GraphvizOnline/, https://graphviz.org/
+    graphviz = (
+        "digraph g {\n"
+        '  fontname="Helvetica,Arial,sans-serif"\n'
+        '  node [fontname="Helvetica,Arial,sans-serif"]\n'
+        '  edge [fontname="Helvetica,Arial,sans-serif"]\n'
+        '  graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];\n'
+        "  ratio=auto;\n"
+    )
+    for table in tables:
+        graphviz += (
+            '  "{table}" [\n'
+            '    style = "filled, bold"\n'
+            "    penwidth = 1\n"
+            '    fillcolor = "white"\n'
+            '    fontname = "Courier New"\n'
+            '    shape = "Mrecord"\n'
+            "    label =<\n"
+            '      <table border="0" cellborder="0" cellpadding="3" bgcolor="white">\n'
+            '         <tr><td bgcolor="black" align="center" colspan="2">'
+            '<font color="white">{table}</font></td></tr>\n{columns}\n'
+            "      </table>> ];\n"
+        ).format(
+            table=table.name,
+            columns="\n".join(
+                [
+                    f'         <tr><td align="left">({x.data_type}) {x.name}</td></tr>'
+                    for x in table.columns
+                ]
+            ),
+        )
+
+    for rel in relationships:
+        key_from = f'"{rel.table_map[1]}"'
+        key_to = f'"{rel.table_map[0]}"'
+        connector = f"{rel.column_map[1]} = {rel.column_map[0]}"
+        graphviz += (
+            f"  {key_from} {get_rel_symbol(rel.type)} {key_to} [ \n"
+            "    penwidth = 1\n"
+            "    fontsize = 12\n"
+            '    fontcolor = "black"\n'
+            f'    label = "{connector}"\n'
+            "  ];\n"
+        )
+
+    graphviz += "}"
+
+    return graphviz
+
+
+def get_rel_symbol(relationship_type: str) -> str:
+    """Get GraphViz relationship symbol
+
+    Args:
+        relationship_type (str): relationship type
+
+    Returns:
+        str: Relation symbol supported in GraphViz
+    """
+    return "->"  # no supports for rel type
diff --git a/dbterd/adapters/targets/mermaid/mermaid_test_relationship.py b/dbterd/adapters/targets/mermaid/mermaid_test_relationship.py
index aba0691..ef68529 100644
--- a/dbterd/adapters/targets/mermaid/mermaid_test_relationship.py
+++ b/dbterd/adapters/targets/mermaid/mermaid_test_relationship.py
@@ -32,7 +32,7 @@ def parse(manifest, catalog, **kwargs):
     # https://mermaid.js.org/syntax/entityRelationshipDiagram.html
     mermaid = "erDiagram\n"
     for table in tables:
-        mermaid += """  \"{table}\" {{\n{columns}\n  }}\n""".format(
+        mermaid += '  "{table}" {{\n{columns}\n  }}\n'.format(
             table=table.name.upper(),
             columns="\n".join(
                 [
diff --git a/tests/unit/adapters/targets/d2/test_d2_test_relationship.py b/tests/unit/adapters/targets/d2/test_d2_test_relationship.py
new file mode 100644
index 0000000..16ee9ad
--- /dev/null
+++ b/tests/unit/adapters/targets/d2/test_d2_test_relationship.py
@@ -0,0 +1,261 @@
+from unittest import mock
+
+import pytest
+
+from dbterd.adapters.algos.meta import Column, Ref, Table
+from dbterd.adapters.targets.d2 import d2_test_relationship as engine
+
+
+class TestD2TestRelationship:
+    @pytest.mark.parametrize(
+        "tables, relationships, select, exclude, resource_type, expected",
+        [
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    )
+                ],
+                [],
+                [],
+                [],
+                ["model"],
+                """
+                    "model.dbt_resto.table1": {
+                        shape: sql_table
+                        name1: name1-type
+                    }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database2--",
+                        schema="--schema2--",
+                        columns=[Column(name="name2", data_type="name2-type2")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="source.dbt_resto.table3",
+                        database="--database3--",
+                        schema="--schema3--",
+                        columns=[Column(name="name3", data_type="name3-type3")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [
+                    Ref(
+                        name="test.dbt_resto.relationships_table1",
+                        table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
+                        column_map=["name2", "name1"],
+                    ),
+                    Ref(
+                        name="test.dbt_resto.relationships_table1",
+                        table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
+                        column_map=["name-notexist2", "name-notexist1"],
+                    ),
+                ],
+                [],
+                [],
+                ["model", "source"],
+                """
+                    "model.dbt_resto.table1": {
+                        shape: sql_table
+                        name1: name1-type
+                        name-notexist1: unknown
+                    }
+                    "model.dbt_resto.table2": {
+                        shape: sql_table
+                        name2: name2-type2
+                        name-notexist2: unknown
+                    }
+                    "source.dbt_resto.table3": {
+                        shape: sql_table
+                        name3: name3-type3
+                    }
+                    "model.dbt_resto.table1" -> "model.dbt_resto.table2": "name1 = name2"
+                    "model.dbt_resto.table1" -> "model.dbt_resto.table2": "name-notexist1 = name-notexist2"
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database2--",
+                        schema="--schema2--",
+                        columns=[Column(name="name2", data_type="name2-type2")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [
+                    Ref(
+                        name="test.dbt_resto.relationships_table1",
+                        table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
+                        column_map=["name2", "name1"],
+                    )
+                ],
+                ["schema:--schema--"],
+                [],
+                ["model", "source"],
+                """
+                    "model.dbt_resto.table1": {
+                        shape: sql_table
+                        name1: name1-type
+                    }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    )
+                ],
+                [],
+                [],
+                ["model.dbt_resto.table1"],
+                ["model"],
+                """
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name2", data_type="name2-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [],
+                ["model.dbt_resto"],
+                ["model.dbt_resto.table2"],
+                ["model"],
+                """
+                    "model.dbt_resto.table1": {
+                        shape: sql_table
+                        name1: name1-type
+                    }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [],
+                ["schema:", "wildcard:", ""],
+                [],
+                ["model"],
+                """
+                    "model.dbt_resto.table1": {
+                        shape: sql_table
+                        name1: name1-type
+                    }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name2", data_type="name2-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [],
+                ["schema:--schema--,wildcard:*dbt_resto.table*"],
+                ["wildcard:*table2"],
+                ["model"],
+                """
+                    "model.dbt_resto.table1": {
+                        shape: sql_table
+                        name1: name1-type
+                    }
+                """,
+            ),
+        ],
+    )
+    def test_parse(
+        self, tables, relationships, select, exclude, resource_type, expected
+    ):
+        with mock.patch(
+            "dbterd.adapters.algos.base.get_tables",
+            return_value=tables,
+        ) as mock_get_tables:
+            with mock.patch(
+                "dbterd.adapters.algos.test_relationship.get_relationships",
+                return_value=relationships,
+            ) as mock_get_relationships:
+                mermaid = engine.parse(
+                    manifest="--manifest--",
+                    catalog="--catalog--",
+                    select=select,
+                    exclude=exclude,
+                    resource_type=resource_type,
+                )
+                print("mermaid ", mermaid.replace(" ", "").replace("\n", ""))
+                print("expected", expected.replace(" ", "").replace("\n", ""))
+                assert mermaid.replace(" ", "").replace("\n", "") == str(
+                    expected
+                ).replace(" ", "").replace("\n", "")
+                mock_get_tables.assert_called_once()
+                mock_get_relationships.assert_called_once()
+
+    @pytest.mark.parametrize(
+        "relationship_type, symbol",
+        [
+            ("0n", "->"),
+            ("1n", "->"),
+            ("01", "->"),
+            ("11", "->"),
+            ("nn", "->"),
+            ("n1", "->"),
+            ("--irrelevant--", "->"),
+        ],
+    )
+    def test_get_rel_symbol(self, relationship_type, symbol):
+        assert engine.get_rel_symbol(relationship_type=relationship_type) == symbol
diff --git a/tests/unit/adapters/targets/graphviz/test_graphviz_test_relationship.py b/tests/unit/adapters/targets/graphviz/test_graphviz_test_relationship.py
new file mode 100644
index 0000000..6991a5b
--- /dev/null
+++ b/tests/unit/adapters/targets/graphviz/test_graphviz_test_relationship.py
@@ -0,0 +1,377 @@
+from unittest import mock
+
+import pytest
+
+from dbterd.adapters.algos.meta import Column, Ref, Table
+from dbterd.adapters.targets.graphviz import graphviz_test_relationship as engine
+
+
+class TestGraphVizTestRelationship:
+    @pytest.mark.parametrize(
+        "tables, relationships, select, exclude, resource_type, expected",
+        [
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    )
+                ],
+                [],
+                [],
+                [],
+                ["model"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                    "model.dbt_resto.table1" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table1</font></td></tr>
+                            <tr><td align="left">(name1-type ) name1</td></tr>
+                            </table>> ];
+                }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database2--",
+                        schema="--schema2--",
+                        columns=[Column(name="name2", data_type="name2-type2")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="source.dbt_resto.table3",
+                        database="--database3--",
+                        schema="--schema3--",
+                        columns=[Column(name="name3", data_type="name3-type3")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [
+                    Ref(
+                        name="test.dbt_resto.relationships_table1",
+                        table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
+                        column_map=["name2", "name1"],
+                    ),
+                    Ref(
+                        name="test.dbt_resto.relationships_table1",
+                        table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
+                        column_map=["name-notexist2", "name-notexist1"],
+                    ),
+                ],
+                [],
+                [],
+                ["model", "source"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                    "model.dbt_resto.table1" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table1</font></td></tr>
+                            <tr><td align="left">(name1-type) name1</td></tr>
+                            <tr><td align="left">(unknown) name-notexist1</td></tr>
+                            </table>> ];
+                    "model.dbt_resto.table2" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table2</font></td></tr>
+                            <tr><td align="left">(name2-type2) name2</td></tr>
+                            <tr><td align="left">(unknown) name-notexist2</td></tr>
+                            </table>> ];
+                    "source.dbt_resto.table3" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">source.dbt_resto.table3</font></td></tr>
+                            <tr><td align="left">(name3-type3) name3</td></tr>
+                            </table>> ];
+                    "model.dbt_resto.table1" -> "model.dbt_resto.table2" [
+                        penwidth = 1
+                        fontsize = 12
+                        fontcolor = "black"
+                        label = "name1 = name2"
+                    ];
+                    "model.dbt_resto.table1" -> "model.dbt_resto.table2" [
+                        penwidth = 1
+                        fontsize = 12
+                        fontcolor = "black"
+                        label = "name-notexist1 = name-notexist2"
+                    ];
+                }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database2--",
+                        schema="--schema2--",
+                        columns=[Column(name="name2", data_type="name2-type2")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [
+                    Ref(
+                        name="test.dbt_resto.relationships_table1",
+                        table_map=["model.dbt_resto.table2", "model.dbt_resto.table1"],
+                        column_map=["name2", "name1"],
+                    )
+                ],
+                ["schema:--schema--"],
+                [],
+                ["model", "source"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                    "model.dbt_resto.table1" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table1</font></td></tr>
+                            <tr><td align="left">(name1-type) name1</td></tr>
+                            </table>> ];
+                }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    )
+                ],
+                [],
+                [],
+                ["model.dbt_resto.table1"],
+                ["model"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name2", data_type="name2-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [],
+                ["model.dbt_resto"],
+                ["model.dbt_resto.table2"],
+                ["model"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                    "model.dbt_resto.table1" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table1</font></td></tr>
+                            <tr><td align="left">(name1-type) name1</td></tr>
+                            </table>> ];
+                }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [],
+                ["schema:", "wildcard:", ""],
+                [],
+                ["model"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                    "model.dbt_resto.table1" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table1</font></td></tr>
+                            <tr><td align="left">(name1-type) name1</td></tr>
+                            </table>> ];
+                }
+                """,
+            ),
+            (
+                [
+                    Table(
+                        name="model.dbt_resto.table1",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name1", data_type="name1-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                    Table(
+                        name="model.dbt_resto.table2",
+                        database="--database--",
+                        schema="--schema--",
+                        columns=[Column(name="name2", data_type="name2-type")],
+                        raw_sql="--irrelevant--",
+                    ),
+                ],
+                [],
+                ["schema:--schema--,wildcard:*dbt_resto.table*"],
+                ["wildcard:*table2"],
+                ["model"],
+                """digraph g {
+                    fontname="Helvetica,Arial,sans-serif"
+                    node [fontname="Helvetica,Arial,sans-serif"]
+                    edge [fontname="Helvetica,Arial,sans-serif"]
+                    graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir="LR"];
+                    ratio=auto;
+                    "model.dbt_resto.table1" [
+                        style = "filled, bold"
+                        penwidth = 1
+                        fillcolor = "white"
+                        fontname = "Courier New"
+                        shape = "Mrecord"
+                        label =<
+                            <table border="0" cellborder="0" cellpadding="3" bgcolor="white">
+                            <tr><td bgcolor="black" align="center" colspan="2">
+                            <font color="white">model.dbt_resto.table1</font></td></tr>
+                            <tr><td align="left">(name1-type) name1</td></tr>
+                            </table>> ];
+                }
+                """,
+            ),
+        ],
+    )
+    def test_parse(
+        self, tables, relationships, select, exclude, resource_type, expected
+    ):
+        with mock.patch(
+            "dbterd.adapters.algos.base.get_tables",
+            return_value=tables,
+        ) as mock_get_tables:
+            with mock.patch(
+                "dbterd.adapters.algos.test_relationship.get_relationships",
+                return_value=relationships,
+            ) as mock_get_relationships:
+                graphviz = engine.parse(
+                    manifest="--manifest--",
+                    catalog="--catalog--",
+                    select=select,
+                    exclude=exclude,
+                    resource_type=resource_type,
+                )
+                print("graphviz ", graphviz.replace(" ", "").replace("\n", ""))
+                print("expected", expected.replace(" ", "").replace("\n", ""))
+                assert graphviz.replace(" ", "").replace("\n", "") == str(
+                    expected
+                ).replace(" ", "").replace("\n", "")
+                mock_get_tables.assert_called_once()
+                mock_get_relationships.assert_called_once()
+
+    @pytest.mark.parametrize(
+        "relationship_type, symbol",
+        [
+            ("0n", "->"),
+            ("1n", "->"),
+            ("01", "->"),
+            ("11", "->"),
+            ("nn", "->"),
+            ("n1", "->"),
+            ("--irrelevant--", "->"),
+        ],
+    )
+    def test_get_rel_symbol(self, relationship_type, symbol):
+        assert engine.get_rel_symbol(relationship_type=relationship_type) == symbol
diff --git a/tests/unit/cli/test_runner.py b/tests/unit/cli/test_runner.py
index fab0afc..acc2348 100644
--- a/tests/unit/cli/test_runner.py
+++ b/tests/unit/cli/test_runner.py
@@ -71,6 +71,8 @@ def test_invoke_run_with_invalid_strategy(self, dbterd: dbterdRunner) -> None:
             ("dbml", "output.dbml"),
             ("mermaid", "output.md"),
             ("plantuml", "output.plantuml"),
+            ("graphviz", "output.graphviz"),
+            ("d2", "output.d2"),
         ],
     )
     def test_invoke_run_ok(self, target, output, dbterd: dbterdRunner) -> None: