Skip to content

Commit 8d69668

Browse files
adds operation and test
1 parent 916be82 commit 8d69668

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

digital_land/expectations/operation.py

+35
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,38 @@ def count_deleted_entities(
186186
}
187187

188188
return result, message, details
189+
190+
191+
def check_columns(conn, expected: dict):
192+
details = []
193+
success_count = 0
194+
failure_count = 0
195+
# expected: a dictionary containing table names as keys, with their a list of their expected columns as the value
196+
for k, v in expected.items():
197+
table_name = k
198+
expected_columns = v
199+
sql = f"""
200+
PRAGMA table_info({table_name})
201+
"""
202+
rows = conn.execute(sql).fetchall()
203+
actual = [row[1] for row in rows]
204+
success = set(expected_columns).issubset(set(actual))
205+
missing = list(set(expected_columns) - set(actual))
206+
details.append(
207+
{
208+
"table": table_name,
209+
"success": success,
210+
"missing": missing,
211+
"actual": actual,
212+
"expected": expected_columns,
213+
}
214+
)
215+
if success:
216+
success_count += 1
217+
else:
218+
failure_count += 1
219+
220+
result = False if failure_count > 0 else True
221+
message = f"{success_count} out of {success_count + failure_count} tables had expected columns"
222+
223+
return result, message, details

tests/integration/expectations/test_operation.py

+61
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import spatialite
2+
import sqlite3
23
import pytest
34
import pandas as pd
45

56
from digital_land.expectations.operation import (
7+
check_columns,
68
count_lpa_boundary,
79
count_deleted_entities,
810
)
@@ -174,3 +176,62 @@ def test_count_deleted_entities(dataset_path, mocker):
174176
for key in detail_keys:
175177
assert key in details, f"{key} missing from details"
176178
assert "1002" in details["entities"]
179+
180+
181+
def test_check_columns(dataset_path):
182+
expected = {
183+
"entity": [
184+
"dataset",
185+
"end_date",
186+
"entity",
187+
"entry_date",
188+
"geojson",
189+
"geometry",
190+
"json",
191+
"name",
192+
"organisation_entity",
193+
"point",
194+
"prefix",
195+
"reference",
196+
"start_date",
197+
"typology",
198+
],
199+
"old_entity": ["old_entity", "entity"],
200+
}
201+
202+
with sqlite3.connect(dataset_path) as conn:
203+
result, message, details = check_columns(conn.cursor(), expected)
204+
205+
assert result
206+
assert "2 out of 2 tables had expected columns" in message
207+
208+
209+
def test_check_columns_failure(dataset_path):
210+
expected = {
211+
"entity": [
212+
"missing",
213+
"columns",
214+
"dataset",
215+
"end_date",
216+
"entity",
217+
"entry_date",
218+
"geojson",
219+
"geometry",
220+
"json",
221+
"name",
222+
"organisation_entity",
223+
"point",
224+
"prefix",
225+
"reference",
226+
"start_date",
227+
"typology",
228+
],
229+
"old_entity": ["old_entity", "entity"],
230+
}
231+
232+
with sqlite3.connect(dataset_path) as conn:
233+
result, message, details = check_columns(conn.cursor(), expected)
234+
assert result
235+
assert "1 out of 2 tables had expected columns" in message
236+
assert not details[0]["success"]
237+
assert details[0]["missing"] == ["missing", "columns"]

0 commit comments

Comments
 (0)