Skip to content

Commit a612c25

Browse files
Adds check columns operation (#344)
* adds operation and test * fixes test * fixes test (again) * adds comments * expands tests
1 parent e2b6924 commit a612c25

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

digital_land/expectations/operation.py

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

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

tests/integration/expectations/test_operation.py

+66
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,67 @@ 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+
assert details[0]["table"] == "entity"
209+
assert any(x in details[0]["actual"] for x in expected["entity"])
210+
assert any(x in details[0]["expected"] for x in expected["entity"])
211+
212+
213+
def test_check_columns_failure(dataset_path):
214+
expected = {
215+
"entity": [
216+
"missing",
217+
"columns",
218+
"dataset",
219+
"end_date",
220+
"entity",
221+
"entry_date",
222+
"geojson",
223+
"geometry",
224+
"json",
225+
"name",
226+
"organisation_entity",
227+
"point",
228+
"prefix",
229+
"reference",
230+
"start_date",
231+
"typology",
232+
],
233+
"old_entity": ["old_entity", "entity"],
234+
}
235+
236+
with sqlite3.connect(dataset_path) as conn:
237+
result, message, details = check_columns(conn.cursor(), expected)
238+
assert not result
239+
assert "1 out of 2 tables had expected columns" in message
240+
assert not details[0]["success"]
241+
assert "missing" in details[0]["missing"]
242+
assert "columns" in details[0]["missing"]

0 commit comments

Comments
 (0)