59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""CHECK — verify the JSONPlaceholder /users extraction artifact.
|
|
|
|
Reads users.csv (defaults to the committed copy in the troupe repo) and
|
|
asserts:
|
|
* header row is exactly the 8 expected columns
|
|
* there are exactly 10 data rows
|
|
* three spot rows match values re-derivable from the HTTP response
|
|
|
|
Exit 0 only if every assertion holds; non-zero otherwise.
|
|
"""
|
|
import csv
|
|
import sys
|
|
|
|
# Committed artifact path (what ships to the repo).
|
|
DEFAULT_CSV = "/root/troupe-standup/wizard-work/ledger/2026-10-23-jpv-users.csv"
|
|
|
|
HEADER = ["id", "name", "username", "email", "city", "phone", "website", "company"]
|
|
|
|
# (name, username, email, city, website, company)
|
|
EXPECTED = {
|
|
"1": ("Leanne Graham", "Bret", "Sincere@april.biz", "Gwenborough",
|
|
"hildegard.org", "Romaguera-Crona"),
|
|
"3": ("Clementine Bauch", "Samantha", "Nathan@yesenia.net",
|
|
"McKenziehaven", "ramiro.info", "Romaguera-Jacobson"),
|
|
"10": ("Clementina DuBuque", "Moriah.Stanton", "Rey.Padberg@karina.biz",
|
|
"Lebsackbury", "ambrose.net", "Hoeger LLC"),
|
|
}
|
|
|
|
|
|
def main():
|
|
csv_path = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_CSV
|
|
with open(csv_path, newline="") as f:
|
|
reader = csv.DictReader(f)
|
|
if reader.fieldnames != HEADER:
|
|
print("HEADER MISMATCH: got %r" % (reader.fieldnames,))
|
|
return 1
|
|
rows = list(reader)
|
|
|
|
if len(rows) != 10:
|
|
print("ROW COUNT MISMATCH: %d" % len(rows))
|
|
return 1
|
|
|
|
for r in rows:
|
|
key = r["id"]
|
|
if key in EXPECTED:
|
|
want = EXPECTED[key]
|
|
got = (r["name"], r["username"], r["email"], r["city"],
|
|
r["website"], r["company"])
|
|
if got != want:
|
|
print("ROW %s MISMATCH: got %r want %r" % (key, got, want))
|
|
return 1
|
|
print("OK: header exact, 10 rows, 3 spot rows verified")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|