From 198be76745a757f783b392288ce5ba2ec401422d Mon Sep 17 00:00:00 2001 From: Sualeh Fatehi Date: Sun, 23 Apr 2023 16:06:05 -0400 Subject: [PATCH] Add test for Markdown output --- .../test/script/MarkdownScriptTest.java | 57 +++++ .../resources/MarkdownScriptTest.markdown.txt | 229 ++++++++++++++++++ .../src/test/resources/markdown.py | 61 +++++ 3 files changed, 347 insertions(+) create mode 100644 schemacrawler-scripting/src/test/java/schemacrawler/test/script/MarkdownScriptTest.java create mode 100644 schemacrawler-scripting/src/test/resources/MarkdownScriptTest.markdown.txt create mode 100644 schemacrawler-scripting/src/test/resources/markdown.py diff --git a/schemacrawler-scripting/src/test/java/schemacrawler/test/script/MarkdownScriptTest.java b/schemacrawler-scripting/src/test/java/schemacrawler/test/script/MarkdownScriptTest.java new file mode 100644 index 0000000000..62e02566e0 --- /dev/null +++ b/schemacrawler-scripting/src/test/java/schemacrawler/test/script/MarkdownScriptTest.java @@ -0,0 +1,57 @@ +/* +======================================================================== +SchemaCrawler +http://www.schemacrawler.com +Copyright (c) 2000-2023, Sualeh Fatehi . +All rights reserved. +------------------------------------------------------------------------ + +SchemaCrawler is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +SchemaCrawler and the accompanying materials are made available under +the terms of the Eclipse Public License v1.0, GNU General Public License +v3 or GNU Lesser General Public License v3. + +You may elect to redistribute this code under any of these licenses. + +The Eclipse Public License is available at: +http://www.eclipse.org/legal/epl-v10.html + +The GNU General Public License v3 and the GNU Lesser General Public +License v3 are available at: +http://www.gnu.org/licenses/ + +======================================================================== +*/ + +package schemacrawler.test.script; + +import static org.hamcrest.MatcherAssert.assertThat; +import static schemacrawler.test.utility.FileHasContent.classpathResource; +import static schemacrawler.test.utility.FileHasContent.hasSameContentAs; +import static schemacrawler.test.utility.FileHasContent.outputOf; +import static schemacrawler.test.utility.ScriptTestUtility.scriptExecution; +import org.junit.jupiter.api.Test; +import schemacrawler.test.utility.AssertNoSystemOutOutput; +import schemacrawler.test.utility.ResolveTestContext; +import schemacrawler.test.utility.TestContext; +import schemacrawler.test.utility.WithSystemProperty; +import schemacrawler.test.utility.WithTestDatabase; +import us.fatehi.utility.datasource.DatabaseConnectionSource; + +@AssertNoSystemOutOutput +@ResolveTestContext +@WithTestDatabase +public class MarkdownScriptTest { + + @Test + @WithSystemProperty(key = "python.console.encoding", value = "UTF-8") + public void markdown(final TestContext testContext, final DatabaseConnectionSource dataSource) + throws Exception { + assertThat( + outputOf(scriptExecution(dataSource, "/markdown.py")), + hasSameContentAs(classpathResource(testContext.testMethodFullName() + ".txt"))); + } +} diff --git a/schemacrawler-scripting/src/test/resources/MarkdownScriptTest.markdown.txt b/schemacrawler-scripting/src/test/resources/MarkdownScriptTest.markdown.txt new file mode 100644 index 0000000000..71a32a7f2a --- /dev/null +++ b/schemacrawler-scripting/src/test/resources/MarkdownScriptTest.markdown.txt @@ -0,0 +1,229 @@ +# FROM TEST: Database Schema Diagram + +## PUBLIC.BOOKS.AUTHORS + +## Columns +- ID (INTEGER) +- FIRSTNAME (VARCHAR) +- LASTNAME (VARCHAR) +- ADDRESS1 (VARCHAR) +- ADDRESS2 (VARCHAR) +- CITY (VARCHAR) +- STATE (CHARACTER) +- POSTALCODE (VARCHAR) +- COUNTRY (VARCHAR) + +## Primary Key +("ID") + +## Indexes +- IDX_B_AUTHORS ("LASTNAME", "FIRSTNAME") +- IDX_A_AUTHORS ("CITY", "STATE", "POSTALCODE", "COUNTRY") + +## Foreign Keys +- PUBLIC.BOOKS.AUTHORS --> PUBLIC.BOOKS.BOOKAUTHORS + + + +## PUBLIC.BOOKS.BOOKS + +## Columns +- ID (INTEGER) +- TITLE (VARCHAR) +- DESCRIPTION (VARCHAR) +- PUBLISHERID (INTEGER) +- PUBLICATIONDATE (DATE) +- PRICE (DOUBLE) +- PREVIOUSEDITIONID (INTEGER) + +## Primary Key +("ID") + +## Indexes +- U_PREVIOUSEDITION ("PREVIOUSEDITIONID"), unique index +- FK_PREVIOUSEDITION ("PREVIOUSEDITIONID") + +## Foreign Keys +- PUBLIC.BOOKS.BOOKS --> PUBLIC.BOOKS.BOOKAUTHORS +- PUBLIC.BOOKS.BOOKS --> PUBLIC.BOOKS.BOOKS +- PUBLIC.BOOKS.BOOKS --> PUBLIC."PUBLISHER SALES".SALES + + + +## PUBLIC.BOOKS."Celebrities" + +## Columns +- Id (INTEGER) +- NAME (VARCHAR) + +## Primary Key +("Id") + +## Indexes + +## Foreign Keys +- PUBLIC.BOOKS."Celebrities" --> PUBLIC.BOOKS."Celebrity Updates" + + + +## PUBLIC.BOOKS.COUPONS + +## Columns +- ID (INTEGER) +- DATA (CLOB) +- COUPONS (PUBLIC.BOOKS."INTEGER ARRAY") +- BOOKS (PUBLIC.BOOKS."VARCHAR(20) ARRAY[10]") + +## Primary Key +("ID") + +## Indexes + + + +## PUBLIC.BOOKS.CUSTOMERDATA + +## Columns +- ID (INTEGER) +- DATA (PUBLIC.BOOKS.VALID_STRING) + +## Primary Key +("ID") + +## Indexes + + + +## PUBLIC.BOOKS.CUSTOMERS + +## Columns +- ID (INTEGER) +- FIRSTNAME (PUBLIC.BOOKS.NAME_TYPE) +- LASTNAME (PUBLIC.BOOKS.NAME_TYPE) +- AGE (PUBLIC.BOOKS.AGE_TYPE) + +## Primary Key +("ID") + +## Indexes + + + +## PUBLIC.BOOKS.PUBLISHERS + +## Columns +- ID (INTEGER) +- PUBLISHER (VARCHAR) + +## Primary Key +("ID") + +## Indexes + +## Foreign Keys +- PUBLIC.BOOKS.PUBLISHERS --> PUBLIC.BOOKS.ΒΙΒΛΊΑ + + + +## PUBLIC."PUBLISHER SALES".REGIONS + +## Columns +- CITY (VARCHAR) +- STATE (VARCHAR) +- POSTALCODE (VARCHAR) +- COUNTRY (VARCHAR) + +## Primary Key +("POSTALCODE", "COUNTRY") + +## Indexes + +## Foreign Keys +- PUBLIC."PUBLISHER SALES".REGIONS --> PUBLIC."PUBLISHER SALES".SALES + + + +## PUBLIC."PUBLISHER SALES".SALESDATA + +## Columns +- SALESDATAID (INTEGER) +- YEARLYAMOUNT (DOUBLE) + +## Indexes +- UQ_CUSTOMERS ("SALESDATAID"), unique index + +## Foreign Keys +- PUBLIC."PUBLISHER SALES".SALESDATA --> PUBLIC."PUBLISHER SALES".SALES + + + +## PUBLIC.BOOKS.BOOKAUTHORS + +## Columns +- BOOKID (INTEGER) +- AUTHORID (INTEGER) +- SOMEDATA (VARCHAR) + +## Indexes +- Z_FK_AUTHOR ("AUTHORID") +- SYS_FK_10120 ("BOOKID") +- UIDX_BOOKAUTHORS ("BOOKID", "AUTHORID"), unique index + + + +## PUBLIC.BOOKS."Celebrity Updates" + +## Columns +- Celebrity Id (INTEGER) +- UPDATE (VARCHAR) + +## Primary Key +("Celebrity Id") + +## Indexes + + + +## PUBLIC.BOOKS.ΒΙΒΛΊΑ + +## Columns +- ΜΟΝΑΔΙΚΌΣ (SMALLINT) +- ΤΊΤΛΟΣ (VARCHAR) +- ΠΕΡΙΓΡΑΦΉ (VARCHAR) +- ΕΚΔΌΤΗΣ (SMALLINT) + +## Primary Key +("ΜΟΝΑΔΙΚΌΣ") + +## Indexes +- FK_ΒΙΒΛΊΑ_PUBLISHERS ("ΕΚΔΌΤΗΣ") + + + +## PUBLIC."PUBLISHER SALES".SALES + +## Columns +- POSTALCODE (VARCHAR) +- COUNTRY (VARCHAR) +- BOOKID (INTEGER) +- COUPON_ID (INTEGER) +- PERIODENDDATE (DATE) +- TOTALAMOUNT (DOUBLE) +- SALESDATAID (INTEGER) + +## Indexes +- FK_SALES_BOOK ("BOOKID") +- FK_SALES_SALESDATA ("SALESDATAID") +- FK_SALES_REGIONS ("POSTALCODE", "COUNTRY") + + + +## PUBLIC.BOOKS.AUTHORSLIST + +## Columns +- ID (INTEGER) +- FIRSTNAME (VARCHAR) +- LASTNAME (VARCHAR) + + + diff --git a/schemacrawler-scripting/src/test/resources/markdown.py b/schemacrawler-scripting/src/test/resources/markdown.py new file mode 100644 index 0000000000..6bdef057de --- /dev/null +++ b/schemacrawler-scripting/src/test/resources/markdown.py @@ -0,0 +1,61 @@ +from __future__ import print_function +import re +from schemacrawler.schema import \ + TableRelationshipType # pylint: disable=import-error +from schemacrawler.schemacrawler import \ + IdentifiersBuilder # pylint: disable=import-error +from schemacrawler.schemacrawler import \ + IdentifierQuotingStrategy # pylint: disable=import-error +from schemacrawler.utility import \ + MetaDataUtility # pylint: disable=import-error + +if title: + print('# ' + title) +else: + print('# Database Schema') + +identifiers = \ + IdentifiersBuilder.builder() \ + .withIdentifierQuotingStrategy(IdentifierQuotingStrategy.quote_all) \ + .toOptions() + +print('') +for table in catalog.tables: + print('## ' + table.fullName) + + print('') + print('## Columns') + for column in table.columns: + print('- ' + column.name + ' (' + column.columnDataType.toString() + ')') + + if table.hasPrimaryKey(): + print('') + print('## Primary Key') + primaryKey = table.primaryKey + print('(' + + MetaDataUtility.getColumnsListAsString(primaryKey, identifiers) + ') ') + + if not table.indexes.isEmpty(): + print('') + print('## Indexes') + for index in table.indexes: + if table.hasPrimaryKey() and \ + MetaDataUtility.getColumnsListAsString(table.primaryKey, identifiers) == \ + MetaDataUtility.getColumnsListAsString(index, identifiers): + continue + print('- ' + index.name + ' (' + + MetaDataUtility.getColumnsListAsString(index, identifiers) + ')', + end='') + if index.unique: + print(', unique index', end='') + print('') + + if not table.referencingTables.isEmpty(): + print('') + print('## Foreign Keys') + for childTable in table.referencingTables: + print('- ' + table.fullName + ' --> ' + childTable.fullName) + + print('') + print('') + print('')