from sqlite_utils.db import ForeignKey, ColumnDetails from sqlite_utils import cli from sqlite_utils.utils import OperationalError from click.testing import CliRunner import pytest import sqlite3 import textwrap @pytest.fixture def db_to_analyze(fresh_db): stuff = fresh_db["stuff"] stuff.insert_all( [ {"id": 1, "owner": "Terry", "size": 5}, {"id": 2, "owner": "Joan", "size": 4}, {"id": 3, "owner": "Kumar", "size": 5}, {"id": 4, "owner": "Anne", "size": 5}, {"id": 5, "owner": "Terry", "size": 5}, {"id": 6, "owner": "Joan", "size": 4}, {"id": 7, "owner": "Kumar", "size": 5}, {"id": 8, "owner": "Joan", "size": 4}, ], pk="id", ) return fresh_db @pytest.mark.parametrize( "column,expected", [ ( "id", ColumnDetails( table="stuff", column="id", total_rows=8, num_null=0, num_blank=0, num_distinct=8, most_common=None, least_common=None, ), ), ( "owner", ColumnDetails( table="stuff", column="owner", total_rows=8, num_null=0, num_blank=0, num_distinct=4, most_common=[("Joan", 3), ("Terry", 2)], least_common=[("Anne", 1), ("Kumar", 2)], ), ), ( "size", ColumnDetails( table="stuff", column="size", total_rows=8, num_null=0, num_blank=0, num_distinct=2, most_common=[(5, 5), (4, 3)], least_common=None, ), ), ], ) def test_analyze_column(db_to_analyze, column, expected): assert db_to_analyze["stuff"].analyze_column(column, common_limit=2) == expected def test_analyze_table(db_to_analyze, tmpdir): path = str(tmpdir / "test.db") db = sqlite3.connect(path) db.executescript("\n".join(db_to_analyze.conn.iterdump())) result = CliRunner().invoke(cli.cli, ["analyze-tables", path]) assert ( result.output.strip() == textwrap.dedent( """ 1/3: ColumnDetails(table='stuff', column='id', total_rows=8, num_null=0, num_blank=0, num_distinct=8, most_common=None, least_common=None) 2/3: ColumnDetails(table='stuff', column='owner', total_rows=8, num_null=0, num_blank=0, num_distinct=4, most_common=[('Joan', 3), ('Terry', 2), ('Kumar', 2), ('Anne', 1)], least_common=None) 3/3: ColumnDetails(table='stuff', column='size', total_rows=8, num_null=0, num_blank=0, num_distinct=2, most_common=[(5, 5), (4, 3)], least_common=None) """ ).strip() )