from datasette.app import Datasette from datasette.utils import sqlite3 import os import pytest import tempfile TABLES = """ CREATE TABLE "election_results" ( "county" INTEGER, "party" INTEGER, "office" INTEGER, "votes" INTEGER, FOREIGN KEY (county) REFERENCES county(id), FOREIGN KEY (party) REFERENCES party(id), FOREIGN KEY (office) REFERENCES office(id) ); CREATE VIRTUAL TABLE "election_results_fts" USING FTS4 ("county", "party"); CREATE TABLE "county" ( "id" INTEGER PRIMARY KEY , "name" TEXT ); CREATE TABLE "party" ( "id" INTEGER PRIMARY KEY , "name" TEXT ); CREATE TABLE "office" ( "id" INTEGER PRIMARY KEY , "name" TEXT ); """ @pytest.fixture(scope="session") def ds_instance(): with tempfile.TemporaryDirectory() as tmpdir: filepath = os.path.join(tmpdir, "fixtures.db") conn = sqlite3.connect(filepath) conn.executescript(TABLES) yield Datasette([filepath]) def test_inspect_hidden_tables(ds_instance): info = ds_instance.inspect() tables = info["fixtures"]["tables"] expected_hidden = ( "election_results_fts", "election_results_fts_content", "election_results_fts_docsize", "election_results_fts_segdir", "election_results_fts_segments", "election_results_fts_stat", ) expected_visible = ("election_results", "county", "party", "office") assert sorted(expected_hidden) == sorted( [table for table in tables if tables[table]["hidden"]] ) assert sorted(expected_visible) == sorted( [table for table in tables if not tables[table]["hidden"]] ) def test_inspect_foreign_keys(ds_instance): info = ds_instance.inspect() tables = info["fixtures"]["tables"] for table_name in ("county", "party", "office"): assert 0 == tables[table_name]["count"] foreign_keys = tables[table_name]["foreign_keys"] assert [] == foreign_keys["outgoing"] assert [ { "column": "id", "other_column": table_name, "other_table": "election_results", } ] == foreign_keys["incoming"] election_results = tables["election_results"] assert 0 == election_results["count"] assert sorted( [ {"column": "county", "other_column": "id", "other_table": "county"}, {"column": "party", "other_column": "id", "other_table": "party"}, {"column": "office", "other_column": "id", "other_table": "office"}, ], key=lambda d: d["column"], ) == sorted(election_results["foreign_keys"]["outgoing"], key=lambda d: d["column"]) assert [] == election_results["foreign_keys"]["incoming"]